如何在Python3中将输入转义为MySQL数据库? 我正在使用PyMySQL并且工作正常,但是当我尝试做类似的事情时:
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = '{}'".format(request[1]))
如果字符串包含'
或"
,则无效。我也尝试过:
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s",request[1])
这个问题是库(PyMySQL)使用Python2.x的格式化语法%
,它不再起作用了。
我也找到了这个可能的解决方案
conn.escape_string()
here中的,但我不知道在哪里添加此代码。 这就是我得到的:
import pymysql
import sys
conn = pymysql.connect( host = "localhost",
user = "test",
passwd = "",
db = "test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(request[1]))
result = cursor.fetchall()
cursor.close()
conn.close()
编辑:我解决了!在PyMySQL中,正确的方法是这样的:
import pymysql
import sys
conn = pymysql.connect(host="localhost",
user="test",
passwd="",
db="test")
cursor = conn.cursor()
text = conn.escape(request[1])
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(text))
cursor.close()
conn.close()
text = conn.escape(request[1])
行是逃避代码的地方。在PyMySQL代码中找到它。在那里,request[1]
是输入。
答案 0 :(得分:27)
虽然“已解决”的答案有效,但这不是最佳做法。使用符合Python DBI的库时,您应该使用绑定变量而不是格式化字符串并将其传递给执行。这种方法存在固有的危险。
因此,这是正确的方法:
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)
请注意,这不是格式字符串,而是传递给正在执行的游标的绑定变量。
详细信息:Python DBI PEP
答案 1 :(得分:3)
解决。在PyMySQL中,正确的方法是这样的:
import pymysql
import sys
conn = pymysql.connect(host="localhost",
user="test",
passwd="",
db="test")
cursor = conn.cursor()
text = conn.escape(request[1])
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = {}".format(text))
cursor.close()
conn.close()
text = conn.escape(request[1])
行是逃避代码的地方。在PyMySQL代码中找到它。在那里,request[1]
是输入。
答案 2 :(得分:-1)
准备使用辅助功能
def mysql_insert(conn, table, row):
cols = ', '.join('`{}`'.format(col) for col in row.keys())
vals = ', '.join('%({})s'.format(col) for col in row.keys())
sql = 'INSERT INTO `{0}` ({1}) VALUES ({2})'.format(table, cols, vals)
conn.cursor().execute(sql, row)
conn.commit()
用法示例
insert_into(conn, 'people', {
'firstname': 'John',
'lastname': 'Doe',
'age': 18, })
参考:https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L157-L158
def execute(self, query, args=None):
If args is a list or tuple, %s can be used as a placeholder in the query. If args is a dict, %(name)s can be used as a placeholder in the query.