2009-08-20 18 views
30

मैं इस अजगर MYSQL अद्यतन बयान (चर के साथ) सही पाने के लिए कोशिश कर रहा हूँ:अजगर MYSQL अद्यतन बयान

cursor.execute ("UPDATE tblTableName SET Year=%s" % Year ", Month=%s" % Month ", Day=%s" % Day ", Hour=%s" % Hour ", Minute=%s" Minute "WHERE Server=%s " % ServerID) 

कोई भी विचार मैं कहाँ गलत हो रहा हूँ?

उत्तर

61

यह should be:

cursor.execute (""" 
    UPDATE tblTableName 
    SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
    WHERE Server=%s 
""", (Year, Month, Day, Hour, Minute, ServerID)) 

आप भी यह बुनियादी स्ट्रिंग परिवर्तन के साथ कर सकते हैं,

cursor.execute ("UPDATE tblTableName SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s WHERE Server='%s' " % (Year, Month, Day, Hour, Minute, ServerID)) 

लेकिन this way is discouraged because it leaves you open for SQL Injection। चूंकि यह सही तरीके सेटीएम करने के लिए इतना आसान (और समान) है। यह सही ढंग से करो।

केवल एक चीज आपको सावधान रहना चाहिए, यह है कि कुछ डेटाबेस बैकएंड स्ट्रिंग प्रतिस्थापन के लिए समान सम्मेलन का पालन नहीं करते हैं (SQLite दिमाग में आता है)।

cursor.execute (""" 
    UPDATE tblTableName 
    SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
    WHERE Server=%s 
""", (Year, Month, Day, Hour, Minute, ServerID)) 

अधिक के लिए, read the documentation:

+5

पाओलो का जवाब बेहतर है। http://stackoverflow.com/questions/1307378/python-mysql-update-statement/1307413#1307413 – voyager

+0

लेकिन यह प्रत्येक बैकएंड के साथ काम करेगा। यह संस्करण इनपुट पर कोई सत्यापन नहीं करता है, जबकि पाओलो का तरीका वैरिएबल सामग्री से बचने के लिए सुनिश्चित करेगा। – voyager

+5

ऐसा करें * नहीं * इसे इस तरह से करें। आप स्वयं को एसक्यूएल इंजेक्शन हमलों के लिए खुले छोड़ देते हैं। पाउलो का सही जवाब है, क्योंकि यह सुनिश्चित करता है कि डीबी को पास करने से पहले मूल्य ठीक से बच निकले हैं। –

42

आप वाक्य रचना सब गलत मिल गया है।

+3

+1 आप मुझसे ज्यादा तेज थे :) –

+0

यह स्वीकार्य उत्तर होना चाहिए। –

10

यह सही तरीका है:

import MySQLdb 

if __name__ == '__main__': 
    connect = MySQLdb.connect(host="localhost", port=3306, 
           user="xxx", passwd="xxx", db='xxx', charset='utf8') 

    cursor = connect.cursor() 

    cursor.execute(""" 
     UPDATE tblTableName 
     SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
     WHERE Server=%s 
    """, (Year, Month, Day, Hour, Minute, ServerID)) 

    connect.commit() 
    connect.close() 

पी.एस. connect.commit() को न भूलें, या यह

+0

यह – emir

+0

प्रतिबद्ध किए बिना काम करता है यह प्रतिबद्ध किए बिना काम नहीं करता है, मैं अजगर 3.5 का उपयोग करता हूं – Belter

3

काम नहीं करेगा, उनमें से कोई भी किसी कारण से मेरे लिए काम नहीं करता है।

मुझे यह पता चला कि किसी कारण से पायथन% s नहीं पढ़ता है। तो एसक्यूएल कोड में% S के बजाय (?) का उपयोग करें।

और अंततः यह मेरे लिए काम किया।

cursor.execute ("update tablename set columnName = (?) where ID = (?) ",("test4","4")) 
    cursor.commit() 
संबंधित मुद्दे