sqlite3“IN”子句

时间:2015-07-17 10:12:39

标签: 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))

但似乎在抱怨:

sqlite3.OperationalError: near "?": syntax error

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

1 个答案:

答案 0 :(得分:2)

因此,Alex Martelli的答案基本上解决了您的问题,因为对IN的python支持非常笨拙,实质上您必须提供与您的集合中的值一样多的?

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)

上面的代码应该做,并且对它的作用有点解释:

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

如果您将查询转换为字符串,则必须确保自己清理这些不推荐的值。