【发布时间】:2016-02-11 16:54:30
【问题描述】:
我在 sqlite3 数据库中有一个宽表,我希望在 Python 脚本中动态查询某些列。我知道it's bad to inject parameters by string concatenation,所以我尝试使用参数替换。
我发现,当我使用参数替换来提供列名时,会得到意想不到的结果。一个最小的例子:
import sqlite3 as lite
db = lite.connect("mre.sqlite")
c = db.cursor()
# Insert some dummy rows
c.execute("CREATE TABLE trouble (value real)")
c.execute("INSERT INTO trouble (value) VALUES (2)")
c.execute("INSERT INTO trouble (value) VALUES (4)")
db.commit()
for row in c.execute("SELECT AVG(value) FROM trouble"):
print row # Returns 3
for row in c.execute("SELECT AVG(:name) FROM trouble", {"name" : "value"}):
print row # Returns 0
db.close()
有没有比简单地将列名注入字符串并运行它更好的方法来实现这一点?
【问题讨论】:
-
同意,这就是答案!