Jawaban:
Kode sampel Anda seharusnya berfungsi sebagaimana mestinya. SQLAlchemy harus memberikan nilai untuk f.id
, dengan asumsi kolom kunci primernya dibuat secara otomatis. Atribut kunci utama diisi segera dalam flush()
proses saat dibuat, dan tidak ada panggilan ke yang commit()
diperlukan. Jadi jawabannya di sini terletak pada satu atau beberapa hal berikut:
Saya baru saja mengalami masalah yang sama, dan setelah pengujian saya menemukan bahwa TIDAK ADA jawaban yang cukup.
Saat ini, atau pada sqlalchemy .6+, ada solusi yang sangat sederhana (saya tidak tahu apakah ini ada di versi sebelumnya, meskipun saya membayangkannya ada):
session.refresh ()
Jadi, kode Anda akan terlihat seperti ini:
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.
Begitulah cara melakukannya.
sessionmaker(autoflush=True)
, combo w / refresh () memberi saya ID baris. #grrr
flush()
dan commit()
, berikut penjelasan yang bagus: stackoverflow.com/a/4202016/1252290
flush()
digunakan commit()
dan setelah itu - segarkan dengan session.refresh(f)
, berfungsi untuk saya, dan saya menggunakan versi SQLAlchemy0.6.7
Terima kasih untuk semuanya. Saya memecahkan masalah saya dengan memodifikasi pemetaan kolom. Bagi saya, autoincrement=True
diperlukan.
asal:
id = Column('ID', Integer, primary_key=True, nullable=False)
setelah diubah:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
kemudian
session.flush()
print(f.id)
baiklah!
tidak seperti jawaban yang diberikan oleh dpb, penyegaran tidak diperlukan. setelah Anda menyiram, Anda dapat mengakses bidang id, sqlalchemy secara otomatis menyegarkan id yang dibuat secara otomatis di backend
Saya mengalami masalah ini dan menemukan alasan yang tepat setelah beberapa penyelidikan, model saya dibuat dengan id sebagai integerfield dan dalam bentuk saya id diwakili dengan hiddenfield (karena saya tidak ingin menunjukkan id dalam formulir saya). Bidang tersembunyi secara default direpresentasikan sebagai teks. setelah saya mengubah formulir menjadi integerfield dengan widget = hiddenInput ()) masalah terpecahkan.
Anda harus mencoba menggunakan, session.save_or_update(f)
bukan session.add(f)
.
save_or_update
sudah tidak digunakan lagi sejak 0,5 atau lebih. session.add()
harus melakukannya.
echo=True
, dan melihat SQL apa yang dieksekusi pada saat bersamaan? Apa yang Anda jelaskan seharusnya berfungsi dan memberi Anda id, tetapi mungkin ada beberapa masalah lain yang menyebabkan f.id menjadi None.