【发布时间】: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,它仍然应该适用。