PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQLalchemy भूमिका निर्धारित करते समय परिवर्तन नहीं कर रहा है

यहाँ मुद्दा यह है कि कैसे 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में ओवरलैपिंग तिथियों के लिए परीक्षण कैसे करें

  2. पैरामीटर के रूप में पूर्णांक सरणियों को पोस्टग्रेज करता है?

  3. PostgreSQL सहसंबंध समारोह का उपयोग करना

  4. चेक बाधा में SQL उप प्रश्न

  5. PostgreSQL डेटाबेस कॉलम से केवल संख्यात्मक मान लौटाएं