Je veux faire quelque chose comme ça:
f = Foo(bar='x')
session.add(f)
session.flush()
# do additional queries using f.id before commit()
print f.id # should be not None
session.commit()
Mais f.id
c'est None
quand je l'essaye. Comment puis-je faire fonctionner cela?
python
sqlalchemy
Eloff
la source
la source
echo=True
et voir quel SQL est exécuté au moment du vidage? Ce que vous décrivez devrait fonctionner et vous donner l'identifiant, mais il se peut qu'il y ait un autre problème qui fait que f.id soit None.Réponses:
Votre exemple de code doit avoir fonctionné tel quel. SQLAlchemy doit fournir une valeur pour
f.id
, en supposant qu'il s'agit d'une colonne de clé primaire à génération automatique. Les attributs de clé primaire sont remplis immédiatement dans leflush()
processus au fur et à mesure qu'ils sont générés, et aucun appel àcommit()
ne doit être requis. La réponse ici réside donc dans un ou plusieurs des éléments suivants:la source
Je viens de rencontrer le même problème, et après les tests, j'ai trouvé qu'aucune de ces réponses n'est suffisante.
Actuellement, ou à partir de sqlalchemy .6+, il existe une solution très simple (je ne sais pas si cela existe dans la version précédente, même si j'imagine que c'est le cas):
session.refresh ()
Donc, votre code ressemblerait à ceci:
Voilà comment procéder.
la source
sessionmaker(autoflush=True)
, ce combo w / refresh () m'a fourni l'ID de ligne. #grrrflush()
etcommit()
, voici une bonne explication: stackoverflow.com/a/4202016/1252290flush()
utilisercommit()
et juste après - actualisez-le avecsession.refresh(f)
, fonctionne pour moi, et j'utilise la version SQLAlchemy0.6.7
Merci pour tout le monde. J'ai résolu mon problème en modifiant le mappage des colonnes. Pour moi,
autoincrement=True
c'est nécessaire.origine:
après modification:
puis
c'est ok!
la source
contrairement à la réponse donnée par dpb, un rafraîchissement n'est pas nécessaire. une fois que vous videz, vous pouvez accéder au champ id, sqlalchemy actualise automatiquement l'identifiant qui est automatiquement généré au backend
J'ai rencontré ce problème et j'ai compris la raison exacte après quelques recherches, mon modèle a été créé avec id comme integerfield et dans ma forme l'id était représenté avec hiddenfield (puisque je ne voulais pas montrer l'id dans mon formulaire). Le champ masqué est par défaut représenté sous forme de texte. une fois que j'ai changé le formulaire en integerfield avec widget = hiddenInput ()), le problème a été résolu.
la source
Une fois, j'ai eu un problème avec l'attribution
0
à id avant d'appeler lasession.add
méthode. L'ID a été correctement attribué par la base de données mais l'ID correct n'a pas été récupéré de la session aprèssession.flush()
.la source
Vous devriez essayer d'utiliser à la
session.save_or_update(f)
place desession.add(f)
.la source
save_or_update
est obsolète depuis environ 0,5.session.add()
devrait le faire.