问题 如何在对SQLite3的Python调用中获取可变长度占位符


有没有办法在SQL查询中使用可变长度占位符?

现在有一个3元组,我写这样的东西:

c.execute('SELECT * FROM table WHERE word IN (?, ?, ?)', tup)

但是,如果 TUP 可以是不同的长度,也许是4元组或2元组?在这种情况下是否有使用占位符的语法?如果没有,编写代码的首选方法是什么?


3323
2017-11-03 06:51


起源



答案:


你必须做这样的事情(使用你的例子):

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字符串。


12
2017-11-03 06:57



我曾希望有?或者?*这种事情的变种,但你的建议会做得很好。 - Raymond Hettinger
我写的 ', '.join('?' for a in tup) 如 ', '.join('?'*len(tup)) - Duncan
@Duncan:Idunno对我来说似乎不太清楚信号噪音。生成器理解似乎更像是英语 - rossipedia
将 'SELECT * FROM table WHERE word IN (%s)' % (len(tup) * '?, ') 在SQL查询中不接受最后一个逗号? - eyquem
我希望@eyquem现在已经解决了这个问题,但是为了完整性:不,这里的尾随逗号在语法上没有用,尽管这个 可能因实施而异 (像往常一样用于SQL)。 - Air


答案:


你必须做这样的事情(使用你的例子):

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字符串。


12
2017-11-03 06:57



我曾希望有?或者?*这种事情的变种,但你的建议会做得很好。 - Raymond Hettinger
我写的 ', '.join('?' for a in tup) 如 ', '.join('?'*len(tup)) - Duncan
@Duncan:Idunno对我来说似乎不太清楚信号噪音。生成器理解似乎更像是英语 - rossipedia
将 'SELECT * FROM table WHERE word IN (%s)' % (len(tup) * '?, ') 在SQL查询中不接受最后一个逗号? - eyquem
我希望@eyquem现在已经解决了这个问题,但是为了完整性:不,这里的尾随逗号在语法上没有用,尽管这个 可能因实施而异 (像往常一样用于SQL)。 - Air