Saya ingin melakukan sesuatu seperti ini:
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()
Tapi f.id
apakah None
saat saya mencobanya. Bagaimana saya bisa membuat ini bekerja?
python
sqlalchemy
Eloff
sumber
sumber
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.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 dalamflush()
proses saat dibuat, dan tidak ada panggilan ke yangcommit()
diperlukan. Jadi jawabannya di sini terletak pada satu atau beberapa hal berikut:sumber
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:
Begitulah cara melakukannya.
sumber
sessionmaker(autoflush=True)
, combo w / refresh () memberi saya ID baris. #grrrflush()
dancommit()
, berikut penjelasan yang bagus: stackoverflow.com/a/4202016/1252290flush()
digunakancommit()
dan setelah itu - segarkan dengansession.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:
setelah diubah:
kemudian
baiklah!
sumber
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.
sumber
Saya pernah mengalami masalah dengan menetapkan
0
ke id sebelum memanggilsession.add
metode. ID ditetapkan dengan benar oleh database tetapi id yang benar tidak diambil dari sesi setelahnyasession.flush()
.sumber
Anda harus mencoba menggunakan,
session.save_or_update(f)
bukansession.add(f)
.sumber
save_or_update
sudah tidak digunakan lagi sejak 0,5 atau lebih.session.add()
harus melakukannya.