sqlalchemy flacon: AttributeError: 'Session' objet n'a pas d'attribut "_model_changes" sur la session.commit()
J'ai vu beaucoup de problèmes avec SessionMaker, mais celui-ci est légèrement différente. Je ne sais pas pourquoi, mais sqlalchemy ne laisserai pas mon objet de session s'engager.
Dans mon application, j'ai un code qui n':
views.py
rec = session.query(Records).filter(Records.id==r).first()
n = rec.checkoutRecord(current_user.id)
session.add(n)
session.commit()
models.py:
class Records(UserMixin, CRUDMixin, Base):
__table__ = Table('main_records', Base.metadata, autoload=True)
def checkoutRecord(self,uid):
self.editing_uid = uid
self.date_out = datetime.now()
return self
def checkinRecord(self,uid):
self.editing_uid = uid
self.date_in = datetime.now()
return self
Le programme de craps sur le commit(), donnant à l'exception ci-dessus. Fait intéressant, certains code de test qui n'a pas d'importation flacon, mais ne l'importation de sqlalchemy fonctionne très bien et me permet de valider sans erreur.
Le full stack-trace:
Traceback (most recent call last):
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask_login.py", line 663, in decorated_view
return func(*args, **kwargs)
File "/Users/bhoward/projects/PeerCoUI/mk2/peercoui/app/records/views.py", line 65, in select_view
session.commit()
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 149, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 721, in commit
self.transaction.commit()
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 354, in commit
self._prepare_impl()
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 323, in _prepare_impl
self.session.dispatch.before_commit(self.session)
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/event.py", line 372, in __call__
fn(*args, **kw)
File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 162, in session_signal_before_commit
d = session._model_changes
AttributeError: 'Session' object has no attribute '_model_changes'
Code complet pour le projet est sur github: https://github.com/bhoward00/peercoui
Tous les conseils apprécié
Ce projet a donc été en utilisant à la fois en flacon de sqlalchemy et sqlalchemy. J'ai supprimé toutes les traces de flacon-sqlalchemy comme une solution temporaire, et les choses semblent bien se passer.
OriginalL'auteur bhoward | 2013-11-25
Vous devez vous connecter pour publier un commentaire.
Oui c'est exactement problème lors de l'utilisation de
flask-sqlalchemy
modèles mixtes avec de la puresqlalchemy
session. C'est queflask-sqlalchemy
sous-classes de la baseSession
desqlalchemy
et ajoute quelques éléments internes dont l'un est le_model_changes
dict. Ce dict est utilisé pour la modification de modèle de suivi.Donc, si vous voulez utiliser
flask-sqlalchemy
à base de modèles régulièrementsqlalchemy
session, on pourrait juste ajouter le dict de la session (c'est juste un exemple de code):J'ai eu exactement le même problème que vous, j'espère donc que cela devrait vous aider.
Mise à JOUR:
Il y a une nouvelle version disponible, ce qui devrait être la fixation de ce comportement, citant le 2.0 docs:
Docs: http://flask-sqlalchemy.pocoo.org/2.0/changelog/#version-2-0
Aujourd'hui, j'ai rencontré le même problème sur Windows 7, et le même correctif travaillé: mise à niveau en Flacon de SQLAlchemy. Je n'ai pas besoin d'séparément de mise à niveau de SQLAlchemy; qui s'est fait automatiquement. J'ai tout pip install --mise à niveau en Flacon de SQLAlchemy.
OriginalL'auteur jbub
J'ai eu le même problème, et résolu en modifiant le _SessionSignalEvents classe au sein de init.py en flacon-sqlalchemy. Cependant, je viens de remarquer qu'un tel correctif a déjà été mis en place depuis 8 mois sur le dépôt officiel.
Si vous rencontrez un problème similaire, je vous recommande de tirer la dernière version du projet sur github (https://github.com/mitsuhiko/flask-sqlalchemy/) depuis celle actuellement disponible via pip install est obsolète.
OriginalL'auteur olipo186