在python+sqlite3中的列表中搜索

在python+sqlite3中的列表中搜索,python,sqlite,Python,Sqlite,我正在使用sqlite3模块运行python,并希望搜索与列表匹配的行。sql应该如下所示 SELECT column FROM table WHERE column IN (1, 2, 3, 4, 5) val_num = [ 1, 2, 3, 4, 5 ] val_str = ', '.join( [ str(v) for v in val_num ] ) db = sqlite3.connect( filename ) sql = '''SELECT column FROM ta

我正在使用sqlite3模块运行python,并希望搜索与列表匹配的行。sql应该如下所示

SELECT column FROM table WHERE column IN (1, 2, 3, 4, 5)
val_num = [ 1, 2, 3, 4, 5 ]
val_str = ', '.join( [ str(v) for v in val_num ] )

db = sqlite3.connect( filename )   
sql = '''SELECT column FROM table WHERE column IN (?)'''
cur = db.cursor()
cur.execute( sql, (val_str,) )
print( cur.fetch_all() )
cur.close()
在python中,建议使用?用于值替换的参数,因此

SELECT column FROM table WHERE column IN (1, 2, 3, 4, 5)
val_num = [ 1, 2, 3, 4, 5 ]
val_str = ', '.join( [ str(v) for v in val_num ] )

db = sqlite3.connect( filename )   
sql = '''SELECT column FROM table WHERE column IN (?)'''
cur = db.cursor()
cur.execute( sql, (val_str,) )
print( cur.fetch_all() )
cur.close()
这将返回一个空列表,[]

但是,如果我手动将值替换到sql语句中(这是不建议的),它将按预期工作

val_num = [ 1, 2, 3, 4, 5 ]
val_str = ', '.join( [ str(int(v)) for v in val_num ] )

db = sqlite3.connect( filename )   
sql = '''SELECT column FROM table WHERE column IN ({})'''.format( val_str )
cur = db.cursor()
cur.execute( sql, (val_str,) )
print( cur.fetch_all() )
cur.close()
返回[1,2,3,4,5,]


如何使用API语法执行此语句,而不是手动替换值?

尝试使用此方法执行IN操作:

val_num = [ 1, 2, 3, 4, 5 ]

query_str = ''' 
SELECT column FROM table
where
column in  (
''' + ','.join('%s' for i in range(len(val_num))) + ' ) '

cursor.execute(query_str, params=tuple(val_num))
rows = cursor.fetchall()

这是伪代码,没有给出使游标对象成为n all的语句。只要尝试更改您的查询字符串和执行行(参见本例),您就可以使用它。

占位符mechansim在这里传递单个文本值,而不是列表。因此:

SELECT column FROM table WHERE column IN (?)
。。。生成一个查询,其中所有值都填充在同一文本字符串中,如:

SELECT column FROM table WHERE column IN ('1, 2, 3, 4, 5')
where谓词等价于:column='1,2,3,4,5',这显然不是您想要的

你需要一个占位符吗?列表中的每个值。以下是一种方法:

sql='SELECT column FROM table WHERE column IN{0}'。format','join'?'表示u IN val_num; cur.executesql,val_num;
如果目标是使用服务器端参数替换,则需要构建查询以获得准确的参数替换量?您有要检查的变量。以下几点应能实现这一目标

val_num = [1, 2, 3, 4, 5]
qs = ", ".join("?" * len(val_num))

query = f"SELECT column FROM table WHERE column IN {qs}"
cur.execute(sql, val_str)
用什么来构建val_str?而不是实际值。