sqlite3“IN”子句

cod*_*ler 3 python sql sqlite

我有一个包含不同列的表(pageNum、value1、value2、value3)。

我想在 python3.3 和 sqlite3 中做类似的事情:

selection = (100, 200, 300)

cursor.execute(""" SELECT value1, value3
                  FROM myTable
                  WHERE value2>? and pageNum IN ?
                  """, (10, selection))
Run Code Online (Sandbox Code Playgroud)

但似乎它在抱怨:

sqlite3.OperationalError: near "?": syntax error
Run Code Online (Sandbox Code Playgroud)

请注意,问题是关于如何以IN这种方式使用子句,而不是关于如何执行查询,当然在这种情况下可以以不同的方式完成。

use*_*759 5

因此,Alex Martelli 的答案本质上是解决你的问题,因为 python 对 的支持IN非常笨重,本质上你必须提供尽可能多的?集合中的值。

selection = (100, 200, 300)
questionmarks = '?' * len(selection)
formatted_query = 'SELECT value1, value3 FROM myTable
              WHERE value2>? AND pageNum IN ({})'.format(','.join(questionmarks))
query_args = [10]
query_args.extend(selection)
result_set = c.execute(formatted_query, query_args)
Run Code Online (Sandbox Code Playgroud)

上面的代码应该可以做到这一点,下面是对其作用的一些解释:

它本质上是根据您需要的数量准备 sql 语句?,然后使用列表中提供的所有参数执行查询,这样 sqlite 将负责转义这些值。

如果将查询转换为字符串,则必须确保自己清理这些值,但不建议这样做。