141 votes

sqlalchemy flush () et insère l'id?

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 est None quand je l'essaie. Comment puis-je le faire fonctionner?

-Dan

147voto

dpb Points 593

Je viens de rencontrer le même problème et après des tests, j’ai trouvé que AUCUNE de ces réponses n’était 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, bien que je l’imagine):

session.refresh ()

Donc, votre code ressemblerait à quelque chose comme ça:

 f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB, 
# and has been automatically assigned a unique primary key id

f.id
# is None

session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)

f.id
# is the automatically assigned primary key ID given in the database.
 

Voilà comment le faire.

84voto

zzzeek Points 22617

votre exemple de code devrait être de fournir une valeur pour l' f.id, en supposant un autogenerating colonne de clé primaire. clé primaire attributs sont remplis immédiatement dans le flush (), car elles sont générées et qu'aucun appel n'est commit() devrait être obligatoire. Donc, la réponse se trouve dans les détails de votre cartographie, s'il y a des bizarres caprices du backend utilisées (par exemple, SQLite n'est pas de générer des valeurs entières pour une clé primaire composite) et/ou que les émissions de SQL dit lorsque vous allumez l'écho.

-2voto

David Z Points 49476

Je ne suis pas un expert, mais vous devrez peut-être vous engager avant d'essayer d'accéder à l'ID. Vider la session peut ne pas suffire.

 f = Foo(bar='x')
session.add(f)
session.commit()
print f.id # should be not None
 

-6voto

Mohit Ranka Points 720

Vous devriez essayer d'utiliser session.save_or_update(f) au lieu de session.add(f) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X