2012-07-17 13 views
6

मैं एक शब्दकोश से अद्यतन करने के लिए एक पुनः उपयोग करने योग्य mysql कथन बनाने की कोशिश कर रहा हूं जहां कुंजी डेटाबेस फ़ील्ड हैं और उस फ़ील्ड में जाने के लिए डेटा शब्दकोश में इसके साथ जुड़े मूल्य है। MySQL में डालने के लिए फ़ंक्शन बनाते समय यह आसान था क्योंकि इसमें केवल दो सूचियां शामिल थीं। अब, मुझे सूचियों को तोड़ने की जरूरत है।mysql को पायथन के साथ कैसे अपडेट करें जहां फ़ील्ड और प्रविष्टियां एक शब्दकोश से हैं?

यहां मुझे क्या करना है।

fields = self.dictionary.keys() 
vals = self.dictionary.values() 

stmt = "UPDATE TABLE table_name SET %s = '%s'" %(.join(fields), .join(vals))" 

इस तरह एक बयान आउटपुट: की तरह एक तालिका अद्यतन करने के लिए

UPDATE TABLE table_name SET column1, column2 = ('value1','value2') 

मैं मानक प्रारूप करने के लिए उत्पादन के लिए इसकी जरूरत:

UPDATE table_name SET column1=value1, column2=value2 

उत्तर

8

आप शाब्दिक डालने जा नहीं करना चाहती स्ट्रिंग इंटरपोलेशन का उपयोग करने में मूल्य - एसक्यूएल इंजेक्शन हमले एक अच्छी चीज नहीं है (टीएम)। इसके बजाय, आप अपने डेटाबेस के लिए प्रासंगिक प्लेसहोल्डर सिंटैक्स का उपयोग करते हैं (मुझे लगता है कि MySQL's '% s' है)।

नोट: मैं .format यहाँ उपयोग कर रहा हूँ, परिवर्तन% उपयोग करें यदि आप चाहते हैं, लेकिन से बचने के लिए किसी भी% की

d = {'col1': 'val1', 'col2': 'val2'} 
sql = 'UPDATE table SET {}'.format(', '.join('{}=%s'.format(k) for k in d)) 
print sql 
# 'UPDATE table SET col2=%s, col1=%s' 

सही तरीका मानते हुए cur है एक डीबी कर्सर प्रदर्शन करने के लिए क्वेरी है :

cur.execute(sql, d.values()) 

इसका कारण यह है, हालांकि एक शब्दकोश के आदेश को प्रभावी ढंग से मनमाने ढंग से आदेश है काम करता है, एक dict की कुंजियों/मूल्यों के आदेश ऐसे dict(zip(d.keys(), d.values())) == d कि संगत हो जाएगा।

0

कैसे

stmt = "UPDATE TABLE table_name SET " 
for k,v in di.items(): 
    stmt += "%s = %s, " %(k,v) 

stmt = stmt[-2:] 
कोशिश कर के बारे में
संबंधित मुद्दे