python - sqlalchemy फ्लश() और डाला आईडी प्राप्त करें?




(4)

मैं ऐसा कुछ करना चाहता हूं:

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()

लेकिन जब मैं कोशिश करता हूं तो एफ.आईडी कोई नहीं है। में इससे कैसे चला सकता हूँ?

-Dan


आपका नमूना कोड इस तरह काम करना चाहिए था। Sqlalchemy f.id के लिए एक मान प्रदान करना चाहिए, यह एक f.id प्राथमिक कुंजी कॉलम मानते हैं। प्राथमिक कुंजी विशेषताओं को फ्लश () प्रक्रिया के भीतर तत्काल पॉप्युलेट किया जाता है क्योंकि वे उत्पन्न होते हैं और प्रतिबद्ध करने के लिए कोई कॉल आवश्यक नहीं होना चाहिए। तो यहां जवाब आपके मैपिंग के ब्योरे में निहित है, यदि उपयोग में बैकएंड के किसी भी अजीब quirks हैं (जैसे, SQLite एक समग्र प्राथमिक कुंजी के लिए पूर्णांक मान उत्पन्न नहीं करता है) और / या उत्सर्जित एसक्यूएल क्या कहता है जब आप गूंज चालू करें।


आपको session.save_or_update(f) बजाय session.save_or_update(f) का उपयोग करने का प्रयास करना चाहिए।


मैंने अभी एक ही समस्या में भाग लिया है, और परीक्षण के बाद मुझे पता चला है कि इनमें से कोई भी जवाब पर्याप्त नहीं है।

वर्तमान में, या 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.

ऐसा करने के लिए यह है।


सभी के लिए धन्यवाद। मैंने कॉलम मैपिंग को संशोधित करके मेरी समस्या हल की। मेरे लिए, autoincrement=True की आवश्यकता है।

उत्पत्ति: id = Column('ID', Integer, primary_key=True, nullable=False)

संशोधित करने के बाद: id = Column('ID', Integer, primary_key=True, autoincreament=True, nullable=True)

फिर session.flush()
print(f.id)
session.flush()
print(f.id)

ठीक है!





sqlalchemy