如何在Python3中转义MySQL数据库的输入?

如何在Python3中转义MySQL数据库的输入?,mysql,sql,python-3.x,pymysql,Mysql,Sql,Python 3.x,Pymysql,如何在Python3中转义MySQL数据库的输入? 我使用的是PyMySQL,工作正常,但当我尝试执行以下操作时: cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = '{}'".format(request[1])) 如果字符串具有”或“,则它将不起作用。我还尝试了: cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s",request[1]) 问题是,

如何在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()
在中,但我不知道在何处添加此代码。 这就是我所得到的:

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()
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]
是输入。

已解决。在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()
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]
是输入。

尽管“答案是有效的,这不是最佳做法。当使用符合Python DBI的库时,应该使用绑定变量,而不是格式化字符串并将其传递给执行。这种方法存在固有的危险

因此,这是正确的方法:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)
请注意,这不是格式字符串,而是传递给执行游标的绑定变量


有关详细信息:

随时可用的助手功能

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, })
参考:

def execute(self、query、args=None):

如果args是列表或元组,则可以在查询中将%s用作占位符。 如果args是dict,%(name)s可以用作查询中的占位符。
酷。不过,你应该把问题的后半部分贴出来作为答案。您可以接受自己的答案。哎呀,我以前没有看到该按钮。如果问题已解决,请将您自己的问题标记为已接受。:-)@Jocelyn它告诉我“你可以在11小时内接受你自己的答案”,所以我会稍后再试。请注意,即使使用不同的类型,例如整数,也应该使用“%s”。我试图使用“%d”时出现错误:
%d格式:需要一个数字,而不是str
。尝试将此用于批插入,结果一次插入一行。Major Pain直接使用
.format
是一种非常糟糕的做法-@rootsmith的答案是正确的,因为它可以净化。