我有一个包含三列的表格,cell
,trx
和type
。
这是我正在尝试运行的查询:
db.execute("SELECT cell,trx FROM tchdrop").fetchall()
它提供了正确的输出。
然而,当我尝试a = ("cell", "trx")
然后
db.execute("SELECT ?,? FROM tchdrop", t).fetchall()
输出为[(u'cell', u'trx'), (u'cell', u'trx')]
(这是错误的)
我这样做是为了弄清楚如何动态提取列,这是更大问题的一部分。
答案 0 :(得分:3)
python DB-API(如sqlite3)的占位符(?)不支持要传递的列名,所以你必须使用这样的python字符串格式:
a = ("cell", "trx")
query = "SELECT {0},{1} FROM tchdrop".format(*a)
db.execute(query)
编辑:
如果您不知道要传递的列的长度,可以执行以下操作:
a = ("cell", "trx", "foo", "bar")
a = ", ".join(a)
query = "SELECT {0} FROM tchdrop".format(a)
# OUTPUT : 'SELECT cell, trx, foo, bar FROM tchdrop'
db.execute(query)
答案 1 :(得分:0)
库用指定的SQL等效值替换指定的值("cell", "trx")
,因此得到的是SELECT "cell", "trx" FROM tchdrop
。结果是正确的。
使用?
语法无法实现您想要实现的目标。相反,自己做字符串替换。您可以使用正则表达式(如^[a-zA-Z_]$
)检查列名称,以获得更高的安全性。
例如:
columns = ",".join(("cell", "trx"))
db.execute("SELECT %s FROM tchdrop" % columns).fetchall()