Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

पायथन और mySQLdb त्रुटि:ऑपरेशनल एरर:(1054, 'कहां क्लॉज' में अज्ञात कॉलम)

अपने SQL में "स्ट्रिंग इंजेक्शन" का उपयोग न करें, केवल उन मामलों को छोड़कर जहां यह वास्तव में अपरिहार्य है, जैसे कि str(DEPT) यहां यह चुनने के लिए कि आप किस तालिका से चयन कर रहे हैं। हर दूसरे मामले के लिए, इसके बजाय पायथन डीबी एपीआई की पैरामीटर पासिंग सुविधा का उपयोग करें - यह आपके लिए चीजों को ठीक से उद्धृत करेगा और अन्य चीजों के साथ स्वचालित रूप से "एसक्यूएल इंजेक्शन" हमलों के खिलाफ आपका बचाव करेगा। (यह कभी-कभी तेज भी हो सकता है)।

चूंकि MySQLdb दुर्भाग्यपूर्ण संकेतन का उपयोग करता है %s मापदंडों के लिए, यहां आपको क्या करना चाहिए (पीईपी 8-अनुपालन के लिए शैली को ठीक करना, आवश्यक नहीं है लेकिन चोट नहीं पहुंचा सकता;-):

conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))

%% s स्ट्रिंग स्वरूपण में जो q . उत्पन्न करता है सिंगल बनें % प्रत्येक स्वरूपण पर, इसलिए q %s . की दो घटनाओं के साथ बचा है -- जिसे execute CLASS . के सही स्वरूपित संस्करणों के साथ बड़े करीने से भरता है और SEC . सभी str कॉल बेमानी हैं, आदि।

एक तरफ, यदि आप Python 2.6 या बाद के संस्करण पर हैं, तो स्ट्रिंग स्वरूपण के लिए आपको नए format का उपयोग करना चाहिए पुराने % . के बजाय विधि ऑपरेटर - जो आपको अन्य लाभों के साथ उन "डबल अप% साइन्स" की आवश्यकता से बचाता है। मैंने उपरोक्त स्निपेट में उस परिवर्तन को लागू नहीं किया है, यदि आप 2.5 या इससे पहले के संस्करण के साथ फंस गए हैं (इसलिए उपरोक्त कोड केवल हाल ही में पायथन के किसी भी संस्करण में काम करता है)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या MySQL पर एक परमाणु ऑपरेशन सम्मिलित/अद्यतन शामिल है?

  2. यूनियन क्वेरी पर गिनती कैसे करें

  3. MySQL विदेशी कुंजी बाधा नहीं जोड़ सकता

  4. प्रोटोकॉल पैकेट क्रम से बाहर

  5. क्लाउड में डेटाबेस लोड बैलेंसिंग - ProxySQL 2.0 के साथ MySQL मास्टर फ़ेलओवर:भाग एक (परिनियोजन)