2009-10-27 9 views
5

मैं समझता हूँ कि अजगर में एक एसक्यूएल क्वेरी फ़ॉर्मेट करने के लिए सही तरीका इस तरह है:पैरामीटरयुक्त एसक्यूएल क्वेरी को चर में कैसे डालें और फिर पायथन में निष्पादित करें?

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3) 

इतना है कि यह एसक्यूएल इंजेक्शन से बचाता है। मेरा सवाल यह है कि यदि क्वेरी को चर में डालने का कोई तरीका है और फिर इसे निष्पादित करें? मैंने नीचे दिए गए उदाहरण की कोशिश की है लेकिन एक त्रुटि प्राप्त है। क्या इसे करना संभव है?

sql="INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 
cursor.execute(sql) 

उत्तर

10

यहाँ cursor.execute के लिए कॉल हस्ताक्षर है। यदि तर्क दिया जाता है, तो यह एक अनुक्रम होने की उम्मीद है। तो

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 
cursor.execute(*sql_and_params) 

, काम करने के लिए नहीं जा रहा है क्योंकि

cursor.execute(*sql_and_params) 

4 तर्क में टपल sql_and_params फैलता है (और फिर, पर अमल केवल 3 उम्मीद है)।

तुम सच में उपयोग करना आवश्यक है

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 

तो आप जब यह cursor.execute को खिलाने के अलावा इसे तोड़ने करना होगा:

cursor.execute(sql_and_params[0],sql_and_params[1:]) 

लेकिन मैं इसे और अधिक सिर्फ दो उपयोग करने के लिए सुखद लगता है लगता है चर:

sql = "INSERT INTO table VALUES (%s, %s, %s)" 
args= var1, var2, var3 
cursor.execute(sql, args) 
0

आप इस कोशिश कर सकते हैं:

sql="INSERT INTO table VALUES (%s, %s, %s)" 
cursor.execute(sql, var1, var2, var3) 

लेकिन मुझे यकीन है कि अगर आप के लिए क्या देख रहे हैं नहीं कर रहा हूँ। यह इस बात पर निर्भर करता है कि क्या आप वैरिएबल के हिस्से के रूप में मान चाहते हैं या नहीं। यदि आप करते हैं, तो चींट्स अजामा का जवाब शायद सही है।

4

आप बहुत करीब हैं।

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 
cursor.execute(*sql_and_params) 

तारांकन का अर्थ है कि परिवर्तनीय को एक पैरामीटर के रूप में नहीं माना जाना चाहिए बल्कि इसके बजाय कई पैरामीटर में अनपॅक किया गया है।

Definition: cursor.execute(self, query, args=None) 

    query -- string, query to execute on server 
    args -- optional sequence or mapping, parameters to use with query. 

तो सबसे 3 तर्कों पर उम्मीद पर अमल (args वैकल्पिक है):

+0

आपने '%' के बजाय '' 'का उपयोग क्यों किया? उदाहरण के लिए: 'sql_and_params =" टेबल वैल्यूज (% s,% s,% s) में% INSERT "% (var1, var2, var3)' – bzupnick

+0

@bzupnick सरल स्ट्रिंग स्वरूपण ('%' ऑपरेटर) का उपयोग करके , या प्रतिस्थापन, संभावित रूप से एसक्यूएल इंजेक्शन की अनुमति देगा, यदि आवश्यक हो तो शाब्दिक को उद्धरण चिह्न जोड़ने में असफल होने का उल्लेख नहीं किया जाएगा। पैरामीटरेटेड क्वेरी स्वरूपित/प्रतिस्थापित प्रश्नों से अत्यधिक बेहतर हैं। –

संबंधित मुद्दे