ध्यान दें कि psycopg2
. के साथ आपको सरणियों के लिए कोई स्ट्रिंग प्रोसेसिंग करने की आवश्यकता नहीं है। इसे खराब अभ्यास माना जाता है क्योंकि यह त्रुटि-प्रवण है और - सबसे खराब स्थिति में - इंजेक्शन के हमलों को खोल सकता है! आपको हमेशा बाध्य पैरामीटर का उपयोग करना चाहिए। नीचे दिए गए कोड में, मैं TEXT[]
टाइप के साथ केवल एक कॉलम के साथ एक नई टेबल बनाऊंगा। (जैसा कि आपके मूल प्रश्न में है)। फिर मैं एक नई पंक्ति जोड़ूंगा, और उन सभी को अपडेट करूंगा। तो आप दोनों एक INSERT
. देखेंगे और UPDATE
ऑपरेशन (हालांकि दोनों काफी हद तक एक जैसे हैं)।
यदि आप केवल एक मान के साथ अपडेट करते हैं तो एक पायथन गोचा है:cur.execute
SQL कथन को पहले तर्क और पुनरावृत्तीय . के रूप में अपेक्षित करता है दूसरे तर्क के रूप में बाध्य होने वाले पैरामीटर शामिल हैं। निम्नलिखित नहीं होंगे काम:
from psycopg2 import connect
conn = connect('dbname=exhuma')
cur = conn.cursor()
stmt = 'UPDATE foo SET example_value=%s'
new_values = ['a', 'b', 'c']
cur.execute(stmt, (new_values))
conn.commit()
इसका कारण यह है कि (new_values)
अजगर द्वारा new_values
. के रूप में देखा जाता है (इस मामले में माता-पिता को छोड़ दिया जाता है, उन्हें टुपल के रूप में नहीं देखा जाता है)। इसके परिणामस्वरूप त्रुटि होगी कि आप 3 मान प्रदान करते हैं ('a'
, 'b'
और 'c'
) मान के रूप में बाध्य होना है, लेकिन केवल एक प्लेसहोल्डर है (%s
) क्वेरी में। इसके बजाय आपको इसे निम्नानुसार निर्दिष्ट करना होगा (अंत में जोड़े गए अल्पविराम पर ध्यान दें):
from psycopg2 import connect
conn = connect('dbname=exhuma')
cur = conn.cursor()
stmt = 'UPDATE foo SET example_value=%s'
new_values = ['a', 'b', 'c']
cur.execute(stmt, (new_values,))
conn.commit()
इससे पायथन को (new_values,)
दिखाई देगा एक तत्व के साथ एक टपल (जो एक चलने योग्य है) के रूप में, जो क्वेरी प्लेस-होल्डर्स से मेल खाता है। अनुगामी अल्पविराम की अधिक विस्तृत व्याख्या के लिए, टुपल्स पर आधिकारिक दस्तावेज़ देखें।
वैकल्पिक रूप से, आप [new_values]
. भी लिख सकते हैं (new_values,)
. के बजाय , लेकिन - मेरी राय में - (new_values,)
साफ है क्योंकि टुपल्स अपरिवर्तनीय हैं, जबकि सूचियां परिवर्तनशील हैं।
यहां वह तालिका है जिसके साथ मैंने परीक्षण किया:
CREATE TABLE foo (
values TEXT[]
);
और यहां पायथन कोड है, दोनों मान डालने और अपडेट करने के लिए:
from psycopg2 import connect
conn = connect('dbname=exhuma')
cur = conn.cursor()
cur.execute('INSERT INTO foo VALUES (%s)', (['a', 'b'], ))
print('>>> Before update')
cur.execute('SELECT * FROM foo')
for row in cur:
print(type(row[0]), repr(row[0]))
print('>>> After update')
cur.execute('UPDATE foo SET example_values = %s',
(['new', 'updated', 'values'],))
cur.execute('SELECT * FROM foo')
for row in cur:
print(type(row[0]), repr(row[0]))
cur.close()
conn.commit()
conn.close()
प्रत्येक निष्पादन पर, कोड समान सरणी मानों के साथ एक नई पंक्ति सम्मिलित करेगा, फिर WHERE
के बिना एक अद्यतन निष्पादित करेगा। खंड, इसलिए सभी मान अपडेट किए जाते हैं। कुछ निष्पादन के बाद, मैं यह निम्नलिखित आउटपुट देता हूं:
>>> Before update
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['a', 'b']")
>>> After update
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")