Python sqlite参数扩展问题

时间:2011-03-10 10:51:15

标签: python sqlite

我有一个包含三列的表格,celltrxtype。 这是我正在尝试运行的查询:

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')](这是错误的)

我这样做是为了弄清楚如何动态提取列,这是更大问题的一部分。

2 个答案:

答案 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()