ฉันต้องการทำสิ่งนี้:
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()
แต่f.id
คือNone
เมื่อลองแล้ว. ฉันจะทำงานนี้ได้อย่างไร
ฉันต้องการทำสิ่งนี้:
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()
แต่f.id
คือNone
เมื่อลองแล้ว. ฉันจะทำงานนี้ได้อย่างไร
คำตอบ:
โค้ดตัวอย่างของคุณควรใช้งานได้ตามที่เป็นอยู่ SQLAlchemy ควรให้ค่าf.id
โดยสมมติว่าเป็นคอลัมน์คีย์หลักที่สร้างอัตโนมัติ แอตทริบิวต์คีย์หลักจะถูกเติมทันทีภายในflush()
กระบวนการเมื่อสร้างขึ้นและไม่commit()
จำเป็นต้องเรียกใช้ ดังนั้นคำตอบจึงอยู่ในข้อใดข้อหนึ่งต่อไปนี้:
ฉันเพิ่งเจอปัญหาเดียวกันและหลังจากการทดสอบฉันพบว่าไม่มีคำตอบเหล่านี้เพียงพอ
ในปัจจุบันหรือในขณะที่ sqlalchemy .6+ มีวิธีแก้ปัญหาที่ง่ายมาก (ฉันไม่รู้ว่ามีอยู่ในเวอร์ชันก่อนหน้าหรือไม่ แต่ฉันคิดว่าเป็นเช่นนั้น):
session.refresh ()
ดังนั้นรหัสของคุณจะมีลักษณะดังนี้:
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.
นั่นคือวิธีการทำ
sessionmaker(autoflush=True)
คำสั่งผสมที่ w / refresh () ให้ ID แถวแก่ฉัน #grrr
flush()
และcommit()
นี่คือคำอธิบายที่ดี: stackoverflow.com/a/4202016/1252290
flush()
ใช้งานcommit()
และหลังจากนั้น - รีเฟรชด้วยใช้session.refresh(f)
งานได้สำหรับฉันและฉันใช้เวอร์ชัน SQLAlchemy0.6.7
ขอบคุณสำหรับทุกคน ฉันแก้ไขปัญหาของฉันโดยแก้ไขการแมปคอลัมน์ สำหรับฉันautoincrement=True
จำเป็นต้องมี
ที่มา:
id = Column('ID', Integer, primary_key=True, nullable=False)
หลังจากแก้ไข:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
แล้ว
session.flush()
print(f.id)
โอเค!
ไม่เหมือนกับคำตอบที่ได้รับจาก dpb การรีเฟรชไม่จำเป็น เมื่อคุณล้างคุณสามารถเข้าถึงฟิลด์ id ได้ sqlalchemy จะรีเฟรช id โดยอัตโนมัติซึ่งสร้างขึ้นโดยอัตโนมัติที่แบ็กเอนด์
ฉันพบปัญหานี้และหาสาเหตุที่แท้จริงหลังจากการตรวจสอบบางอย่างโมเดลของฉันถูกสร้างขึ้นโดยมี id เป็นจำนวนเต็มและในรูปแบบของฉัน id ถูกแสดงด้วย hiddenfield (เนื่องจากฉันไม่ต้องการแสดง id ในแบบฟอร์มของฉัน) ฟิลด์ที่ซ่อนอยู่โดยค่าเริ่มต้นจะแสดงเป็นข้อความ เมื่อฉันเปลี่ยนฟอร์มเป็น integerfield ด้วย widget = hiddenInput ()) ปัญหาได้รับการแก้ไข
ฉันเคยมีปัญหากับการกำหนดให้0
กับ id ก่อนsession.add
วิธีการโทร ID ถูกกำหนดอย่างถูกต้องโดยฐานข้อมูล แต่ id ที่ถูกต้องไม่ได้รับจากเซสชันหลังจากsession.flush()
นั้น
คุณควรลองใช้session.save_or_update(f)
แทนsession.add(f)
.
save_or_update
เลิกใช้งานตั้งแต่ 0.5 หรือมากกว่านั้น session.add()
ควรทำ
echo=True
และดูว่า SQL ใดถูกเรียกใช้งานในช่วงเวลาฟลัช - ไทม์? สิ่งที่คุณอธิบายควรใช้งานได้และให้รหัสแก่คุณ แต่อาจมีปัญหาอื่น ๆ ที่ส่งผลให้ f.id เป็น None