我将使用 pymysql 将我的代码链接到 MySQL 数据库。总的来说,一切都很顺利,但我在使用以下函数来查找变量列的最小值时遇到困难。
def findmin(column):
cur = db.cursor()
sql = "SELECT MIN(%s) FROM table"
cur.execute(sql,column)
mintup = cur.fetchone()
如果一切顺利,这将返回给我一个具有最小值的元组,例如(1,)
.
但是,如果我运行该函数:
findmin(column_name)
我必须将列名称放入 ""
中(即 "column_name"
),否则 Python 会将其视为未知变量。但是如果我在 column_name
两边加上引号,那么 SQL 就会看到
SELECT MIN("column_name") FROM table
它只返回列标题,而不是值。
我该如何解决这个问题?
最佳答案
问题可能是使用 %s
作为列名称。这意味着SQL 驱动程序在插入变量时会尝试转义该变量,包括引用,这不是您想要的列名、表名等内容。
在SELECT
、WHERE
等中使用值时,您确实需要使用%s
防止 SQL 注入(inject)并启用引用等。
在这里,您只想使用纯 Python 进行插值(假设可信值;请参阅下文了解更多信息)。这也意味着没有绑定(bind)元组传递给 execute
方法。
def findmin(column):
cur = db.cursor()
sql = "SELECT MIN({0}) FROM table".format(column)
cur.execute(sql)
mintup = cur.fetchone()
SQL fiddle 显示 SQL 工作:
http://sqlfiddle.com/#!2/e70a41/1
回应 Colin Phipps 2014 年 7 月 15 日的评论(2022 年 9 月):
另一位社区成员最近对这篇文章的编辑引起了我的注意,我想回应 Colin 多年前的评论。
我完全同意回复:如果有人像这样进行插值,请注意自己的输入。当然,人们需要确切地知道正在插值的内容。在这种情况下,我想说在可信内部脚本中定义的值或由可信内部源提供的值就可以了。但是,正如科林提到的,如果存在任何外部输入,那么情况就会大不相同,并且应该采取额外的预防措施。
关于python - 使用Python访问带有可变列名的SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748898/