【问题标题】:Can I use parameter insertion to specify column names for MySQL queries?我可以使用参数插入来指定 MySQL 查询的列名吗?
【发布时间】:2019-02-06 05:00:50
【问题描述】:

我想知道是否可以使用 Python 将列名的参数插入到 MySQL 查询中。

考虑以下两个查询,这两个查询都传递给MySQLCursor.execute()。第一个:

query = (
      'SELECT username, COUNT(*)'
      'FROM `entry`'
      'GROUP BY username;'
)
cursor.execute(query)

第二个:

query = (
      'SELECT %s, COUNT(*)'
      'FROM `entry`'
      'GROUP BY %s;'
)
data = ('username', 'username')
cursor.execute(query, data)

其中第一个返回我期望的结果(计算每个不同值出现在用户名列中的次数),第二个返回意外结果,特别是 [(u'username', n)] 其中n 是总行数在数据库中。

第二个查询的问题是参数被查询解释为字符串。有没有办法插入它们以便它们可以被解释为非字符串?我想以一种不受注入攻击的方式来做到这一点。

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

    不建议使用第2种语法,第1种是ok且安全的。

    【讨论】:

    • 为什么不推荐?我知道第一个是安全的,但它不允许我动态传递列名以供选择。
    • 为什么要动态传递列?因为您知道每个表的列,所以您应该只创建特定于每个列名称的函数。
    • 如果我想对多个列执行相同的查询并以相同的方式显示结果,那么能够动态传递列名会更好地重用代码。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多