जहाँ तक मुझे पता है, थोक आवेषण जारी करने के लिए ओआरएम प्राप्त करने का कोई तरीका नहीं है। मेरा मानना है कि अंतर्निहित कारण यह है कि SQLAlchemy को प्रत्येक ऑब्जेक्ट की पहचान (यानी, नई प्राथमिक कुंजी) पर नज़र रखने की आवश्यकता होती है, और थोक आवेषण इसमें हस्तक्षेप करते हैं। उदाहरण के लिए, मान लें कि आपकी foo
तालिका में एक id
कॉलम है और उसे Foo
कक्षा में मैप किया गया है :
x = Foo(bar=1)
print x.id
# None
session.add(x)
session.flush()
# BEGIN
# INSERT INTO foo (bar) VALUES(1)
# COMMIT
print x.id
# 1
चूंकि SQLAlchemy ने x.id
किसी अन्य क्वेरी को जारी किए बिना मान लिया , इसलिए हम अनुमान लगा सकते हैं कि इसे INSERT
कथन से सीधे मान मिला । यदि आपको एक ही उदाहरण के माध्यम से निर्मित वस्तुओं तक बाद की पहुँच की आवश्यकता नहीं है , तो आप अपनी प्रविष्टि के लिए ORM परत को छोड़ सकते हैं:
Foo.__table__.insert().execute([{'bar': 1}, {'bar': 2}, {'bar': 3}])
# INSERT INTO foo (bar) VALUES ((1,), (2,), (3,))
SQLAlchemy किसी भी मौजूदा ऑब्जेक्ट के साथ इन नई पंक्तियों से मेल नहीं खा सकता है, इसलिए आपको बाद के किसी भी संचालन के लिए उन्हें नए सिरे से क्वेरी करना होगा।
जहां तक बासी डेटा का सवाल है, यह याद रखना मददगार है कि सत्र सत्र के बाहर डेटाबेस बदलने के दौरान यह जानने का कोई अंतर्निहित तरीका नहीं है। मौजूदा उदाहरणों के माध्यम से बाह्य रूप से संशोधित डेटा तक पहुंचने के लिए, उदाहरणों को समय-सीमा के रूप में चिह्नित किया जाना चाहिए । यह डिफ़ॉल्ट रूप से होता है session.commit()
, लेकिन कॉल करके session.expire_all()
या मैन्युअल रूप से किया जा सकता है session.expire(instance)
। एक उदाहरण (SQL छोड़ा गया):
x = Foo(bar=1)
session.add(x)
session.commit()
print x.bar
# 1
foo.update().execute(bar=42)
print x.bar
# 1
session.expire(x)
print x.bar
# 42
session.commit()
समय सीमा समाप्त हो जाती है x
, इसलिए पहले प्रिंट स्टेटमेंट में एक नया लेन-देन और फिर से क्वेरीज़ x
के गुण खुलते हैं । यदि आप पहले प्रिंट स्टेटमेंट पर टिप्पणी करते हैं, तो आप देखेंगे कि दूसरा अब सही मूल्य चुनता है, क्योंकि नई क्वेरी अपडेट के बाद तक उत्सर्जित नहीं होती है।
यह लेन-देन अलगाव के दृष्टिकोण से समझ में आता है - आपको लेनदेन के बीच केवल बाहरी संशोधनों को चुनना चाहिए। यदि यह आपको परेशान कर रहा है, तो मैं तुरंत आपके आवेदन की लेनदेन की सीमाओं को स्पष्ट करने या फिर से सोचने की सलाह दूंगा session.expire_all()
।