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




3 Answers

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

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

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 स्वचालित रूप से बैकएंड पर जेनरेट की गई आईडी को रीफ्रेश करता है

मुझे इस समस्या का सामना करना पड़ा और कुछ जांच के बाद सटीक कारण पता चला, मेरा मॉडल आईडी के साथ पूर्णांकफील्ड के रूप में बनाया गया था और मेरे रूप में आईडी को छुपा क्षेत्र के साथ दर्शाया गया था (क्योंकि मैं अपने रूप में आईडी नहीं दिखाना चाहता था)। छुपा क्षेत्र डिफ़ॉल्ट रूप से एक पाठ के रूप में प्रतिनिधित्व किया जाता है। एक बार जब मैंने विजेट = hiddenInput () के साथ फॉर्म को पूर्णांकफील्ड में बदल दिया तो समस्या हल हो गई।




session.add कॉल करने से पहले मुझे एक बार आईडी को सौंपा गया था। session.add विधि। आईडी को डेटाबेस द्वारा सही ढंग से असाइन किया गया था लेकिन session.flush() बाद सत्र से सही आईडी पुनर्प्राप्त नहीं की गई थी।




Related