[英]Escaping quotes for MySQL in python
按照此線程上的建議,我將list
作為string
類型存儲在MySQL database
,但是,我遇到了以下錯誤:
_mysql_exceptions.ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'foo_bar" but I can\\\'t bar.\', u\'high\', 0]]")\' at line 1')
在一些像這樣的列表條目上:
var1 = 'Name'
var2 = 'Surname'
var3 = 15
var4 = [u'The Meter', [[u'Black', u'foo foo bar bar "foo_bar" but I can\'t bar', u'high', 0]]]
我認為這是因為在foo_bar
的開頭有一個雙引號,我使用以下代碼在數據庫中創建條目:
SQL = 'INSERT INTO test_table (col1, col2, col3, col4) VALUES ("{}", "{}", "{}", "{}")'.format(var1, var2, var3, var4)
cursor.execute(SQL)
並且雙引號沒有被轉義。 如果我從以下位置刪除雙引號:
("{}", "{}", "{}", "{}")
,我遇到了同樣的錯誤,我嘗試使用不同的字符串格式,(使用%s
)但這也不起作用。
有任何想法嗎?
不要使用字符串格式化插值SQL值。 使用 SQL 參數:
SQL = 'INSERT INTO test_table (col1, col2, col3, col4) VALUES (%s, %s, %s, %s)'
cursor.execute(SQL, (var1, var2, var3, var4))
這里的%s
是 SQL 參數; 然后數據庫會為您轉義這些值(作為`cursor.execute 的第二個參數傳入)。
您需要使用什么語法取決於您的數據庫適配器; 有些使用%s
,其他使用?
對於占位符。
您不能以其他方式將 Python 容器(如列表)用於這些參數。 您必須先將其序列化為字符串格式; 您可以為此使用 JSON,但是您還必須記住在查詢數據庫時再次將 JSON 解碼為 Python 字符串。 這就是另一個問題的答案試圖傳達的內容。
例如,如果var4
是列表,您可以使用:
cursor.execute(SQL, (var1, var2, var3, json.dumps(var4)))
SQL = 'INSERT INTO test_table (col1, col2, col3, col4) VALUES ("{!a}", "{!a}", "{!a}", "{!a}")'.format(var1, var2, var3, str(var4))
cursor.execute(SQL)
{!a}
應用ascii()
並因此轉義非 ASCII 字符,如引號甚至表情符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.