mysql - 如何在 Python3 中将输入转义到 MySQL 数据库?

标签 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])

这个问题是库 (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] 是输入。

最佳答案

虽然“已解决”的答案有效,但这并不是最佳实践。当使用符合 Python DBI 的库时,您应该使用绑定(bind)变量而不是格式化字符串并将其传递给执行。这种方法存在固有的危险。

因此,这是正确的做法:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)

请注意,这不是格式字符串,而是传递给执行游标的绑定(bind)变量。

详情:Python DBI PEP

关于mysql - 如何在 Python3 中将输入转义到 MySQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363335/

相关文章:

MYSQL 用另一列的数据更新列中的文本

mysql - 如何有效地选择具有多对多关系的关联项目的不同标签?

mysql - 从多对多关系中选择按受欢迎程度排序的标签

c# - Entity Framework Code First,不同上下文/数据库之间的导航属性

python-3.x - 检索具有 NAN 值而不是 NAN 值的数据帧行

mysql - Wildfly 10 持久化 MySQL 表未找到

mysql - 无法在 mysql-workbench 上添加外键约束

sql - DB2 查询检索给定模式的所有表名

python-3.x - 如何在while循环中使用return语句?

python - 关键事件似乎卡在使用 `turtle.onkey(function(), "键")`