यहाँ मुद्दा यह है कि कैसे sqlalchemy प्रत्येक कथन के बाद एक कमिट जारी करने का निर्णय लेता है।
अगर कोई टेक्स्ट engine.execute
. को पास किया जाता है , sqlalchemy यह निर्धारित करने का प्रयास करेगा कि पाठ निम्नलिखित रेगेक्स का उपयोग करके एक डीएमएल या डीडीएल है या नहीं। आप इसे यहां के स्रोतों में पा सकते हैं
AUTOCOMMIT_REGEXP = re.compile(
r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)
यह केवल शब्दों का पता लगाता है यदि वे पाठ की शुरुआत में हैं, किसी भी प्रमुख सफेद जगहों को अनदेखा कर रहे हैं। इसलिए, जबकि आपका पहला प्रयास # works fine
, दूसरा उदाहरण यह पहचानने में विफल रहता है कि कथन निष्पादित होने के बाद एक प्रतिबद्धता जारी करने की आवश्यकता है क्योंकि पहला शब्द SET
है .
इसके बजाय, sqlalchemy एक रोलबैक जारी करता है, इसलिए यह # appears to succeed/does NOT throw any error
।
मैन्युअल रूप से प्रतिबद्ध करना सबसे आसान समाधान है।
उदाहरण:
engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")
या, sql को text
. में लपेटें और सेट करें autocommit=True
, जैसा कि दस्तावेज़ीकरण में दिखाया गया है
stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)