जवाबों:
आपके सैंपल कोड को वैसे ही काम करना चाहिए जैसा वह है। 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 / ताज़ा () ने मुझे पंक्ति आईडी प्रदान की। #grrr
flush()
और commit()
:, यहाँ एक अच्छा व्याख्या दी गई है stackoverflow.com/a/4202016/1252290
flush()
उपयोग के बजाय commit()
और उसके ठीक बाद - इसे ताज़ा करें session.refresh(f)
, मेरे लिए काम करता है, और मैं SQLAlchemy संस्करण का उपयोग करता हूं0.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)
ठीक है!
डीपीबी द्वारा दिए गए उत्तर के विपरीत, एक ताज़ा आवश्यक नहीं है। एक बार जब आप फ्लश करते हैं, तो आप आईडी फ़ील्ड का उपयोग कर सकते हैं, sqlalchemy स्वचालित रूप से आईडी को रीफ्रेश करता है जो बैकएंड पर उत्पन्न होता है।
मैंने इस समस्या का सामना किया और कुछ जांच के बाद सटीक कारण का अनुमान लगाया, मेरा मॉडल आईडी के साथ पूर्णांक के रूप में बनाया गया था और मेरे रूप में आईडी को हिडनफील्ड के साथ दर्शाया गया था (क्योंकि मैं अपने फॉर्म में आईडी नहीं दिखाना चाहता था)। छिपे हुए फ़ील्ड को टेक्स्ट के रूप में डिफ़ॉल्ट रूप से दर्शाया जाता है। एक बार जब मैंने विजेट के साथ पूर्णांक को रूप में बदल दिया = हिडन इनपुट ()) समस्या हल हो गई।
आपको session.save_or_update(f)
इसके बजाय उपयोग करने का प्रयास करना चाहिए session.add(f)
।
save_or_update
0.5 या तो के बाद से पदावनत किया गया है। session.add()
करना चाहिए।
echo=True
और देख सकते हैं कि SQL फ्लश-टाइम पर क्या निष्पादित करता है? आप जो वर्णन करते हैं वह काम करना चाहिए और आपको आईडी देना चाहिए , लेकिन हो सकता है कि कोई और मुद्दा हो जिसके परिणामस्वरूप f.id कोई नहीं हो।