[英]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.