2012-12-14 11 views
10

मैं पायथन में इस sqlite3 क्वेरी को निष्पादित करने का प्रयास करता हूं। मैंने कोड को न्यूनतम, sqlite.connect, आदि कार्यों में कम कर दिया।निष्पादन में पाइथन sqlite3 स्ट्रिंग चर

column = 'Pron_1_Pers_Sg' 
goal = 'gender' 
constrain = 'Mann' 


with con: 
    cur = con.cursor() 

    cur.execute("SELECT ? FROM Data where ?=?", (column, goal, constrain)) 
    con.commit() 

    rows = cur.fetchall() 

    for element in rows: 
     values.append(element) 

यह एक खाली सूची देता है। यदि मैं स्ट्रिंग को हार्डकोड करता हूं, तो यह काम करता है और मान देता है।

उत्तर

25

पैरामीटर मार्कर केवल अभिव्यक्तियों के लिए उपयोग किए जा सकते हैं, यानी मूल्य। आप उन्हें टेबल और कॉलम नामों जैसे पहचानकर्ताओं के लिए उपयोग नहीं कर सकते हैं।

उपयोग करें:

cur.execute("SELECT "+column+" FROM Data where "+goal+"=?", (constrain,)) 

या इस:

cur.execute("SELECT %s FROM Data where %s=?" % (column, goal), (constrain,)) 

(। और इससे पहले कि आप वास्तव में डेटा तक पहुँचने समाप्त कर दिया है के लिए प्रतिबद्ध नहीं है)

+0

मैं कसम खाता हूं, मैंने इस सवाल को लिखने से पहले कोशिश की! वैसे भी, यह अब काम करता है। धन्यवाद! – Steffen

+1

यह एसक्यूएल इंजेक्शन के लिए कमजोर होगा? –

+1

@DrewV हां, यदि आप किसी हमलावर द्वारा 'कॉलम' या' लक्ष्य' को नियंत्रित करने की अनुमति देते हैं। –

-1

मुझे आज भी इसी तरह की समस्या थी। मुझे यकीन नहीं कर रहा हूँ अगर यह आपकी समस्या का समाधान हो सकता है:

cur.execute("SELECT ? FROM Data where ?=?", (column, goal, constrain,)) 

महत्वपूर्ण पिछले है,

इसे आज़मा कर देखें, यह मेरा कोड के साथ समस्या थी - तो शायद यह आप भी मदद करता है। क्षमा करें, वास्तव में समझाने में सक्षम नहीं होने के कारण, क्योंकि मैं बस खुद को सीख रहा हूं और कुछ हफ्तों तक पाइथन/स्क्लाइट में हूं।

+2

ए ',' अंत में केवल एक तत्व के साथ tuples के लिए आवश्यक है, उन्हें एक सादे अभिव्यक्ति से अलग करने के लिए। –

+1

धन्यवाद, लेकिन यह मदद नहीं करता है। लेकिन मैं कुछ समझा सकता हूं: यही है, क्योंकि प्रदत्त मूल्य एक ट्यूपल होना चाहिए। – Steffen

+0

बहुत बहुत धन्यवाद। यह वास्तव में मुझे समझने में मदद करता है, मैंने पूरे दिन अपने सिर को लपेटने की कोशिश की। – sdoering

0

इस प्रयास करें: c.execute("SELECT {idf} FROM Data WHERE {goal}".\ format(idf=column, goal=constrain))

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