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 le flush()
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:
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:
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 procéder.
sessionmaker(autoflush=True)
, ce combo w / refresh () m'a fourni l'ID de ligne. #grrr
flush()
et commit()
, voici une bonne explication: stackoverflow.com/a/4202016/1252290
flush()
utiliser commit()
et juste après - actualisez-le avec session.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:
id = Column('ID', Integer, primary_key=True, nullable=False)
après modification:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
puis
session.flush()
print(f.id)
c'est ok!
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.
Vous devriez essayer d'utiliser à la session.save_or_update(f)
place de session.add(f)
.
save_or_update
est obsolète depuis environ 0,5. session.add()
devrait le faire.
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.