Yanıtlar:
Örnek kodunuz olduğu gibi çalışmalıdır. SQLAlchemy f.id
, otomatik olarak oluşturulmuş bir birincil anahtar sütunu varsayarak, için bir değer sağlamalıdır . Birincil anahtar öznitelikleri, flush()
oluşturuldukları anda işlem içinde hemen doldurulur ve herhangi bir çağrıya gerek yoktur commit()
. Yani buradaki cevap aşağıdakilerden biri veya birkaçında yatıyor:
Az önce aynı problemle karşılaştım ve test ettikten sonra bu cevaplardan HİÇBİRİNİN yeterli olmadığını buldum.
Şu anda veya sqlalchemy .6+ olarak çok basit bir çözüm var (bunun önceki sürümde var olup olmadığını bilmiyorum, ancak var olduğunu tahmin ediyorum):
session.refresh ()
Yani kodunuz şuna benzer:
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.
Nasıl yapılır bu.
sessionmaker(autoflush=True)
, bu combo w / renew () bana satır kimliğini sağladı. #grrr
flush()
ve commit()
, burada iyi bir açıklama verilmiştir: stackoverflow.com/a/4202016/1252290
flush()
kullanımı commit()
ve hemen ardından - ile yenileyin session.refresh(f)
, benim için çalışıyor ve ben SQLAlchemy sürümünü kullanın0.6.7
Herkese teşekkürler. Sorunumu sütun eşlemesini değiştirerek çözdüm. Benim autoincrement=True
için gerekli.
Menşei:
id = Column('ID', Integer, primary_key=True, nullable=False)
değiştirildikten sonra:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
sonra
session.flush()
print(f.id)
tamam!
dpb tarafından verilen cevabın aksine, yenileme gerekli değildir. Bir kez yıkadığınızda, kimlik alanına erişebilirsiniz, sqlalchemy arka uçta otomatik olarak oluşturulan kimliği otomatik olarak yeniler
Bu problemle karşılaştım ve bazı araştırmalardan sonra kesin sebebini anladım, modelim tamsayı alanı olarak id ile oluşturuldu ve formumda id gizli alan ile temsil edildi (çünkü formumda kimliği göstermek istemedim). Gizli alan varsayılan olarak bir metin olarak temsil edilir. Widget = hiddenInput ()) ile formu integerfield olarak değiştirdiğimde sorun çözüldü.
Bunun session.save_or_update(f)
yerine kullanmayı denemelisiniz session.add(f)
.
save_or_update
0.5'ten beri kullanımdan kaldırıldı. session.add()
yapmalı.
echo=True
başlatabilir ve yıkama anında hangi SQL'in çalıştırıldığını görebilir misiniz? Ne açıklamak gerekir çalışmak ve size id verir ancak olabilir f.id sonuçlanır Yok olma dair bazı başka sorun var.