python - 使用Python访问带有可变列名的SQL

标签 python mysql sql pymysql

我将使用 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 驱动程序在插入变量时会尝试转义该变量,包括引用,这不是您想要的列名、表名等内容。

SELECTWHERE等中使用时,您确实需要使用%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/

相关文章:

python - 在循环中设置对象属性会导致所有属性具有相同的值

python - groupby 过滤每月余额均为负数的帐户

MySQL,无法创建外键

php - 如何向mysql数据库插入多行

sql - 重新排序 SQL Server 数据库中的项目

python - 处理 diff 文件中的修改

python - 使用selenium python滚动窗口

mysql - 如何在 MYSQL 中屏蔽具有不同域的用户电子邮件地址

SQL Server 加入和查询问题

mysql - 如何检索所有数据并将最新的数据标记为新数据?