簡體   English   中英

從sqlite表中選擇使用python sqlite3的列表中的rowid - DB-API 2.0

[英]select from sqlite table where rowid in list using python sqlite3 — DB-API 2.0

以下作品:

>>> cursor.execute("select * from sqlitetable where rowid in (2,3);")

以下不是:

>>> cursor.execute("select * from sqlitetable where rowid in (?) ", [[2,3]] )
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

有沒有辦法傳入python列表而不必先將其格式化為字符串?

不幸的是。 每個值必須有自己的參數標記( ? )。 由於參數列表可以(可能)具有任意長度,因此必須使用字符串格式化來構建正確數量的參數標記。 令人高興的是,這並不是那么難:

args=[2,3]
sql="select * from sqlitetable where rowid in ({seq})".format(
    seq=','.join(['?']*len(args)))

cursor.execute(sql, args)

在Python 3.6中,您還可以使用f字符串構建查詢:

args=[2, 3]
query = f"SELECT * FROM sqlitetable WHERE rowid in ({','.join(['?']*len(args))})"
cursor.execute(query, args)

SQLite本身僅支持TEXT,INTEGER,REAL,BLOB和NULL類型。 如果您想使用其他類型,您必須自己添加對它們的支持。 detect_types參數和使用模塊級register_converter()函數注冊的自定義轉換器允許您輕松地執行此操作。

如前所述,SQLite本身僅支持一組有限的類型。

要在SQLite中使用其他Python類型,必須使它們適應SQLite的sqlite3模塊支持的類型之一:NoneType,int,float,str,bytes之一。

https://docs.python.org/3.6/library/sqlite3.html#using-adapters-to-store-additional-python-types-in-sqlite-databases

ids_list成為所需行ID的列表,一個簡單的解決方案是:

sql = "SELECT * FROM sqlitetable WHERE rowid IN {}".format(str(tuple(ids_list)
cursor.execute(sql)

暫無
暫無

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

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