1. 程式人生 > >Python連線MySQL資料庫執行sql語句時的引數問題

Python連線MySQL資料庫執行sql語句時的引數問題

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

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

try:
        connection = MySQLdb.connect(user="secsel",passwd="[email protected]",host="192.168.138.55",db="anbench")
    except:
        print "Could not connect to MySQL server."
        exit( 0 )

    cursor = connection.cursor()
    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型別傳遞變數

sql = “INSERT INTO user VALUES(%(username)s, %(password)s, %(email)s)”

value = {“username”:zhangsan,

“password”:123456,

“email”:[email protected]}

cur.execute(sql, value)

  

上面這種方法適合欄位比較多的時候,變數順序不會錯。

附上我寫的指令碼程式碼相關部分:

def get_apkpath(apk_md5):
    try:
        connection = MySQLdb.connect(user="***",passwd="***",host="192.168.***.***",db="***")
    except:
        print "Could not connect to MySQL server."
        exit( 0 )

    cursor = connection.cursor()
    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)  #注意不要加引號
    print "Rows selected:", cursor.rowcount

    for row in cursor.fetchall():
        print "note : ", row[0], row[1], row[2]        
    cursor.close()
    return row[2]