Python連接MySQL數據庫執行sql語句時的參數問題


由於工作需要,今天寫了一個Python小腳本,其中需要連接MySQL數據庫,在執行sql命令時需要傳遞參數,結果出問題了。在網上查了一下,發現有以下幾種方式傳遞參數:

一.直接把sql查詢語句完整寫入字符串

1     try:
2         connection = MySQLdb.connect(user="secsel",passwd="secsel@55",host="192.168.138.55",db="anbench")
3     except:
4         print "Could not connect to MySQL server."
5         exit( 0 )
6 
7     cursor = connection.cursor()
8     cursor.execute( "SELECT a.id,a.md5,CONCAT(b.`from_name`,'/',b.`suffix`,'/',a.`md5`) FROM apk_sec a,apk_from b WHERE a.`apk_from_id`=b.`id` AND a.md5 = %s", apk_md5)    

二.使用參數替代

city = 'beijing'

cur.execute(“SELECT * FROM %s WHERE city = %s”, city)

#注意此處的占位符統統是%s字符串類型,不再區分字符串,數字或者其他類型。另外%s不能加引號,如”%s”這是錯誤的寫法。我就是加引號出錯了。

變量替代的時候還有一種寫法:

cur.execute(“SELECT * FROM %s WHERE city = %s” %city)

前面代碼使用了逗號,這里使用了百分號%。兩者區別在於變量的解釋方式。使用逗號,變量是作為execute的參數傳入的,由MySQLdb的內置方法把變量解釋成合適的內容。使用百分號%則是用Python編譯器對%s執行相應的替代,這種方法是有漏洞的,有些時候(比如包含某些特殊字符的時候)不能正常解析,甚至會有注入漏洞。一般情況下都要把變量作為execute的參數傳入。

3.使用字典dict類型傳遞變量

1 sql = “INSERT INTO user VALUES(%(username)s, %(password)s, %(email)s)”
2 
3 value = {“username”:zhangsan,
4 
5 “password”:123456,
6 
7 “email”:123456@ouvps.com}
8 
9 cur.execute(sql, value)

上面這種方法適合字段比較多的時候,變量順序不會錯。

附上我寫的腳本代碼相關部分:

 1 def get_apkpath(apk_md5):
 2     try:
 3         connection = MySQLdb.connect(user="***",passwd="***",host="192.168.***.***",db="***")
 4     except:
 5         print "Could not connect to MySQL server."
 6         exit( 0 )
 7 
 8     cursor = connection.cursor()
 9     cursor.execute( "SELECT a.id,a.md5,CONCAT(b.`from_name`,'/',b.`suffix`,'/',a.`md5`) FROM apk_sec a,apk_from b WHERE a.`apk_from_id`=b.`id` AND a.md5 = %s", apk_md5)  #注意不要加引號
10     print "Rows selected:", cursor.rowcount
11 
12     for row in cursor.fetchall():
13         print "note : ", row[0], row[1], row[2]        
14     cursor.close()
15     return row[2]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM