【问题标题】:SQLite dynamically bind column name from user inputSQLite 从用户输入动态绑定列名
【发布时间】:2021-02-28 00:05:06
【问题描述】:

一开始我并不知道。我以为我可以只使用 f 字符串。在阅读了关于插入攻击(通过阅读我的意思是火柴人漫画)和关于带有悬空逗号的 SQLite 参数之后,我有了这个。

stat_field = input("Enter stat field: ") 
query = "SELECT player_name, (?) FROM stattable"
conn = sqlite3.connect('pitches.db')
df = pd.read_sql_query(query, conn, params=(stat_field,))
conn.close()

如果我在提示符下键入“pfx_x”,即 stattable 中的一列,数据框将如下所示。

    player_name   (?)
0   Mike Mayers  pfx_x
1   Mike Mayers  pfx_x
2   Mike Mayers  pfx_x

知道如何获取最后一列的实际数据吗?

【问题讨论】:

  • 好主意,但是,它只是将列名从 (?) 更改为 ?。我想如果那是列名,我只需将 pfx_x 放在括号中,但这是绑定错误数不正确。
  • 这似乎不可能。也许在列列表中查找字符串以验证它是一个安全/有效的选择,然后运行适当的查询而不像这样绑定列名。
  • 如果我更改脚本中的值,它会起作用并且我得到了这个。 player_name pfx_x 0 Mike Mayers 0.37 1 Mike Mayers 0.30 2 Mike Mayers -0.77`(以列形式)
  • 是的,如果您将pfx_x 硬编码到查询字符串中,它当然可以工作。但绑定与 f 字符串插值不同。如果我理解正确,它仅适用于与表中的值相关的变量,而不是查询本身。因此,如果您说WHERE player_name=? 并将"Mike Mayers" 作为绑定变量传递,那么绑定将起作用,但您不能说SELECT * FROM ?; 并尝试将其与"stattable" 绑定。请参阅this,即使它不是 SQLite,它仍然应该适用。

标签: python pandas sqlite


【解决方案1】:

我理解这一点很慢,但 ggorlen 为我指明了正确的方向。基本上,绑定变量或占位符不能在 SELECT/FROM 语句中,因为占位符旨在更改预先存在的语句。但是,用户可以选择 player_name,因为该字段始终可用。我必须将我可能在原始查询中使用的所有统计信息都放入其中,但我可以通过添加“WHERE player_name =?”来加快处理速度。然后将 params 更改为 params=(player_name,)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 2013-05-09
    • 2013-01-31
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多