Antworten:
Ihr Beispielcode sollte so funktionieren, wie er ist. SQLAlchemy sollte einen Wert für bereitstellen f.id
, vorausgesetzt, es handelt sich um eine automatisch generierende Primärschlüsselspalte. Primärschlüsselattribute werden sofort innerhalb des flush()
Prozesses beim Generieren ausgefüllt, und es sollte kein Aufruf von commit()
erforderlich sein. Die Antwort hier liegt also in einer oder mehreren der folgenden Aussagen:
Ich bin gerade auf dasselbe Problem gestoßen, und nach dem Testen habe ich festgestellt, dass KEINE dieser Antworten ausreicht.
Derzeit oder ab sqlalchemy .6+ gibt es eine sehr einfache Lösung (ich weiß nicht, ob dies in einer früheren Version vorhanden ist, obwohl ich mir das vorstelle):
session.refresh ()
Ihr Code würde also ungefähr so aussehen:
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.
So geht das.
sessionmaker(autoflush=True)
, diese Kombination mit refresh () lieferte mir die Zeilen-ID. #grrr
flush()
und nicht verstehen commit()
, ist hier eine gute Erklärung: stackoverflow.com/a/4202016/1252290
flush()
verwenden commit()
und direkt danach - aktualisieren Sie es mit session.refresh(f)
, funktioniert für mich, und ich verwende die SQLAlchemy-Version0.6.7
Danke für alle. Ich habe mein Problem gelöst, indem ich die Spaltenzuordnung geändert habe. Für mich autoincrement=True
ist erforderlich.
Ursprung:
id = Column('ID', Integer, primary_key=True, nullable=False)
nach geändert:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
dann
session.flush()
print(f.id)
ist in Ordnung!
Im Gegensatz zu der Antwort von dpb ist eine Aktualisierung nicht erforderlich. Sobald Sie geleert haben, können Sie auf das ID-Feld zugreifen. sqlalchemy aktualisiert automatisch die ID, die im Backend automatisch generiert wird
Ich bin auf dieses Problem gestoßen und habe nach einigen Untersuchungen den genauen Grund herausgefunden. Mein Modell wurde mit der ID als Ganzzahlfeld erstellt und in meinem Formular wurde die ID mit verstecktem Feld dargestellt (da ich die ID nicht in meinem Formular anzeigen wollte). Das ausgeblendete Feld wird standardmäßig als Text dargestellt. Nachdem ich das Formular mit widget = hiddenInput () in integerfield geändert hatte, war das Problem gelöst.
Sie sollten versuchen, session.save_or_update(f)
anstelle von zu verwenden session.add(f)
.
save_or_update
wurde seit ungefähr 0,5 veraltet. session.add()
Sollte es tun.
echo=True
und sehen, welche SQL beim Flush ausgeführt wird? Was Sie beschreiben, sollte funktionieren und Ihnen die ID geben, aber möglicherweise gibt es ein anderes Problem, das dazu führt, dass f.id None ist.