Ich möchte so etwas machen:
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()
Aber f.id
ist , None
wenn ich es versuchen. Wie kann ich das zum Laufen bringen?
python
sqlalchemy
Eloff
quelle
quelle
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.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 desflush()
Prozesses beim Generieren ausgefüllt, und es sollte kein Aufruf voncommit()
erforderlich sein. Die Antwort hier liegt also in einer oder mehreren der folgenden Aussagen:quelle
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:
So geht das.
quelle
sessionmaker(autoflush=True)
, diese Kombination mit refresh () lieferte mir die Zeilen-ID. #grrrflush()
und nicht verstehencommit()
, ist hier eine gute Erklärung: stackoverflow.com/a/4202016/1252290flush()
verwendencommit()
und direkt danach - aktualisieren Sie es mitsession.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:
nach geändert:
dann
ist in Ordnung!
quelle
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.
quelle
Ich hatte einmal ein Problem mit der Zuweisung
0
der ID vor dem Aufruf dersession.add
Methode. Die ID wurde von der Datenbank korrekt zugewiesen, aber die richtige ID wurde danach nicht mehr aus der Sitzung abgerufensession.flush()
.quelle
Sie sollten versuchen,
session.save_or_update(f)
anstelle von zu verwendensession.add(f)
.quelle
save_or_update
wurde seit ungefähr 0,5 veraltet.session.add()
Sollte es tun.