簡體   English   中英

在python + sqlite3中搜索IN列表

[英]Searching IN list in python + sqlite3

我正在使用 sqlite3 模塊運行 python,並想搜索與列表匹配的行。 sql 應該看起來像

SELECT column FROM table WHERE column IN (1, 2, 3, 4, 5)

在 python 中,我們推薦使用? 值替換的參數,所以這應該看起來像

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()

這是偽代碼,沒有給出使cursor對象 n 所有的語句。 只需嘗試更改您的query-string和查看此示例的execute行 - 您就會得到它的工作。

占位符機制在這里傳遞單個文字值,而不是列表。 所以這:

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('?' for _ in val_num));
cur.execute(sql, 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM