2016-09-26 45 views
0

我在將數據傳遞到%s令牌時遇到問題。我環顧四周,發現這個Mysql模塊處理%s標記的方式不同,並且出於安全原因它應該被轉義,我的代碼拋出這個錯誤。Python mysql.connector模塊,將數據傳遞到字符串VALUE%s

mysql.connector.errors.ProgrammingError:1064(42000):您在您的 SQL語法中有錯誤;檢查對應於你的MySQL服務器版本 正確的語法在1號線

如果我不喜歡這樣使用近「%S)」的手冊:

sql_insert = ("INSERT INTO `Products` (title) VALUES(%s)"),(data) 

我得到一個元組的錯誤。 。

import mysql.connector 
from mysql.connector import errorcode 

cnx = mysql.connector.connect (user='userDB1', password='UserPwd1', 
host='somedatabase.com', database='mydatabase1') 
cursor = cnx.cursor() 

sql_insert = ("INSERT INTO `Products` (title) VALUES(%s)") 

data=('HelloSQLWORLD') 

cursor.execute(sql_insert,data) 

cnx.commit() 


cnx.close() 

回答

1

不,不這樣做@Jeon建議的方式 - 通過使用字符串格式化你暴露你的代碼SQL injection attacks。相反,正確參數化查詢

query = """ 
    INSERT INTO 
     Products 
     (title) 
    VALUES 
     (%s)""" 

cursor.execute(query, ('HelloSQLWORLD',)) 

注意查詢參數是如何放入元組

+1

謝謝,這是我正在尋找的答案,儘管@Jonon的解決方案可以工作,但這種方法最好是由於漏洞。 –

0

Python的字符串格式化:

str1 = 'hello' 
str2 = 'world' 
'%s, %s' % (str1, str2) 

使用%tuple,不,

對於您的具體情況,請嘗試:

cursor.execute(sql_insert % (data)) 
+0

不錯,正常工作。 –

+0

對不起,必須使用'','這裏是完全有效的 - 它是'execute()'的參數之間的分隔符。 'execute()'的第二個參數是查詢參數。這不是關於Pythonic與不是,這是關於將參數插入到查詢中的正確方法,也是一種錯誤的方式。感謝您的理解。 – alecxe