python - पायथन MySQL पैरामीटरेटेड क्वेरीज़



(4)

असल में, भले ही आपका चर (सॉन्ग लम्बाई) संख्यात्मक है, फिर भी आपको पैरामीटर को सही तरीके से बांधने के लिए इसे% s के साथ प्रारूपित करना होगा। यदि आप% d का उपयोग करने का प्रयास करते हैं, तो आपको एक त्रुटि मिल जाएगी। इस लिंक से एक छोटा सा अंश यहां दिया गया है http://mysql-python.sourceforge.net/MySQLdb.html :

एक क्वेरी करने के लिए, आपको पहले कर्सर की आवश्यकता होती है, और फिर आप इसके बारे में प्रश्न निष्पादित कर सकते हैं:

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

इस उदाहरण में, max_price = 5 क्यों, स्ट्रिंग में% s का उपयोग करें? चूंकि MySQLdb इसे SQL अक्षर मान में परिवर्तित कर देगा, जो स्ट्रिंग '5' है। जब यह समाप्त हो जाए, तो क्वेरी वास्तव में कहती है, "... कीमत कहां <5"।

https://src-bin.com

मुझे अपने डेटाबेस में जानकारी डालने के लिए MySQLdb मॉड्यूल का उपयोग करने में कठिनाई हो रही है। मुझे तालिका में 6 चर डालने की जरूरत है।

cursor.execute ("""
    INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
    VALUES
        (var1, var2, var3, var4, var5, var6)

""")

क्या कोई मुझे सिंटैक्स के साथ यहां मदद कर सकता है?


Answer #1

आपके पास कुछ विकल्प उपलब्ध हैं। आप पाइथन की स्ट्रिंग इटरपोलेशन के साथ सहज महसूस करना चाहेंगे। भविष्य में जब आप इस तरह की चीजें जानना चाहते हैं तो भविष्य में खोज करने के लिए आपको अधिक सफलता मिल सकती है।

प्रश्नों के लिए बेहतर:

some_dictionary_with_the_data = {
    'name': 'awesome song',
    'artist': 'some band',
    etc...
}
cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)

        """, some_dictionary_with_the_data)

आपको लगता है कि आपके पास पहले से ही एक ऑब्जेक्ट या डिक्शनरी में आपका पूरा डेटा है, दूसरा प्रारूप आपको बेहतर लगेगा। साथ ही यह एक स्ट्रिंग में "% s" उपस्थितियों को गिनने के लिए बेकार है जब आपको वापस आना होगा और इस विधि को एक वर्ष में अपडेट करना होगा :)


Answer #2

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

गलत (सुरक्षा मुद्दों के साथ)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))

सही (भागने के साथ)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))

यह भ्रम में जोड़ता है कि SQL कथन में पैरामीटर को बाध्य करने के लिए उपयोग किए जाने वाले संशोधक विभिन्न डीबी एपीआई कार्यान्वयन के बीच भिन्न होते हैं और MySQL क्लाइंट लाइब्रेरी अधिक सामान्य रूप से स्वीकृत '?' के बजाय printf शैली वाक्यविन्यास का उपयोग करती है। मार्कर (उदाहरण के लिए python-sqlite द्वारा उपयोग किया जाता है)।


Answer #3

चुने गए उत्तर के विकल्प के रूप में, और मार्सेल के समान सुरक्षित अर्थशास्त्र के साथ, मूल्यों को निर्दिष्ट करने के लिए पाइथन शब्दकोश का उपयोग करने का एक कॉम्पैक्ट तरीका यहां दिया गया है। डालने के लिए कॉलम जोड़ने या हटाने के रूप में इसे संशोधित करने में आसान होने का लाभ है:

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  insert='insert into Songs ({0}) values ({1})'.
        .format(','.join(meta_cols), ','.join( ['%s']*len(meta_cols) ))
  args = [ meta[i] for i in meta_cols ]
  cursor=db.cursor()
  cursor.execute(insert,args)
  db.commit()

जहां मेटा डालने के लिए मान रखने वाला शब्दकोश है। अद्यतन उसी तरह किया जा सकता है:

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  update='update Songs set {0} where id=%s'.
        .format(','.join([ '{0}=%s'.format(c) for c in meta_cols ]))
  args = [ meta[i] for i in meta_cols ]
  args.append( songid )
  cursor=db.cursor()
  cursor.execute(update,args)
  db.commit()




mysql