के रूप में क्वेरी पैरामीटर मैं एक नामित शब्दकोश के रूप में MySQLdb
की cursor.execute()
विधि के लिए क्वेरी पैरामीटर पास करना चाहते हैं, वे एसक्यूएल इंजेक्शन से बच गए हैं ऐसा है कि।अजगर MySQLdb: एक नामित शब्दकोश
>>>c.execute('select id from users where username=%(user)s', {'user':'bob',})
KeyError: 'user'
MySQLdb मैनुअल http://mysql-python.sourceforge.net/MySQLdb.html का कहना है::
* paramstyle
स्ट्रिंग निरंतर पैरामीटर मार्कर के प्रकार बताते हुए इंटरफ़ेस द्वारा की उम्मीद स्वरूपण
आप क्यों इस KeyError देता है व्याख्या कर सकते हैं। 'प्रारूप' पर सेट करें = एएनएसआई सी printf प्रारूप कोड, उदा। '... कहां नाम =% s'। यदि conn.execute() के लिए मैपिंग ऑब्जेक्ट का उपयोग किया जाता है, तो इंटरफ़ेस वास्तव में 'pyformat' = पायथन विस्तारित प्रारूप कोड का उपयोग करता है, उदा। '... कहां नाम =% (नाम) एस'। हालांकि, एपीआई वर्तमान में paramstyle में एक से अधिक शैली के विनिर्देश की अनुमति नहीं है *
मैं *** कॉलम मान *** डाल रहा हूं। दस्तावेज़ीकरण में रेखा का अर्थ है कि निम्नलिखित कोड अवैध है: 'c.execute ('% s से आईडी चुनें जहां उपयोगकर्ता नाम =% s', ('उपयोगकर्ता', 'बॉब'))' – mercador
@mercador दाएं, '% s' टुकड़ा से विफलता उत्पन्न हो रही है क्योंकि आप तालिका नाम को पैरामीटर करने का प्रयास कर रहे हैं। इस तरह से 'निष्पादन' का उपयोग करने का लाभ यह है कि यह एसक्यूएल इंजेक्शन को रोकने में मदद करता है, लेकिन यदि आप उचित सुरक्षा सावधानी बरतते हैं (जो कि मैं एक विशेषज्ञ नहीं हूं, लेकिन इसमें उचित स्वच्छता/पैरामीटर से बचने में शामिल होगा), तो आप कर सकते हैं क्वेरी बनाने के लिए स्ट्रिंग स्वरूपण में पाइथन का निर्माण करें और फिर इसे 'निष्पादित करें' पर पास करें। फिर, एसक्यूएल इंजेक्शन मुख्य चिंता है। उम्मीद है की यह मदद करेगा! – RocketDonkey