【发布时间】:2011-11-03 14:57:59
【问题描述】:
有没有办法在 SQL 查询中使用可变长度占位符?
现在有了一个 3 元组,我写了这样的东西:
c.execute('SELECT * FROM table WHERE word IN (?, ?, ?)', tup)
但是如果 tup 可以有不同的长度,可能是 4 元组或 2 元组怎么办?在这种情况下是否有使用占位符的语法?如果没有,编写代码的首选方式是什么?
【问题讨论】:
有没有办法在 SQL 查询中使用可变长度占位符?
现在有了一个 3 元组,我写了这样的东西:
c.execute('SELECT * FROM table WHERE word IN (?, ?, ?)', tup)
但是如果 tup 可以有不同的长度,可能是 4 元组或 2 元组怎么办?在这种情况下是否有使用占位符的语法?如果没有,编写代码的首选方式是什么?
【问题讨论】:
你必须做这样的事情(使用你的例子):
tup = ... # some sequence/tuple of unknown length
sql = 'SELECT * FROM table WHERE word IN (%s)' % ', '.join('?' for a in tup)
c.execute(sql, tup)
这样,您可以在 sqlite3 模块解析之前动态创建占位符列表并格式化 SQL 字符串。
【讨论】:
', '.join('?' for a in tup)写成', '.join('?'*len(tup))
'SELECT * FROM table WHERE word IN (%s)' % (len(tup) * '?, ') 会起作用,还是 SQL 查询不接受最后一个逗号?