INはPythonのsqlite3の中のタプルを持つ値WHEREはどのように選択できますか?

jmkjaer:

私は3つの列とSQLiteのデータベースを持っている、と私はへのタプルのために、パラメータ置換を使用しようとしているSELECT行。これが私のテーブルです。

conn = sqlite3.connect("SomeDb.sqlite3")

conn.execute("""
CREATE TABLE RoadSegmentDistribution(
    Source INTEGER,
    Destination INTEGER,
    Distribution TEXT
)
""")

私は非タプルで代用する方法を知っているが、私はタプルでそれを行う方法を見つけ出すことはできません。

基づいてこの答え、私は単にタプルのリストを挟んで、すべての値を代入すると思っていました:

for e in conn.execute("""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES (?,?), (?,?), (?,?), (?,?), (?,?))
    """,
    [(1, 2),(2, 3),(4, 5),(6, 7),(8, 9)]
):
    print(e)

しかし、その後、私はエラーを取得します

ProgrammingError:供給バインディングの数が正しくありません。現在のステートメントは、10を使用し、供給5があります。

私は右のみ、組ごとに疑問符が必要であることを明らかにこの手段?:

for e in conn.execute("""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES (?), (?), (?), (?), (?))
    """,
    [(1, 2),(2, 3),(4, 5),(6, 7),(8, 9)]
):
    print(e)

しかし、私はこのエラーを取得します:

OperationalError:サブセレクトリターン1列 - 2予想

私は、リストのパラメータが含まれているかわからないので、私は、手動でリンクの答えのように値を挿入することはできません。この手段は、私はいくつかの種類を行う必要があることを",".join()、リストの長さに基づいてを、私は固定長のリストと置換を行う方法を知っていれば私はアウトを把握します。

私はこれをどのように行うのでしょうか?

blhsing:

使用str.join方法は、SQLエンジンにコンテナベースのプレースホルダのネイティブサポートの欠如を考えると、実際にこれを達成するための良い方法です。

values = [(1, 2), (2, 3), (4, 5), (6, 7), (8, 9)]

for e in conn.execute(f"""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES {','.join(f'({",".join("?" * len(t))})' for t in values)})
    """,
    [i for t in values for i in t]
):
    print(e)

どこ、与えられたとvalues

f"""
    SELECT *
    FROM RoadSegmentDistribution
    WHERE (
        Source, Destination
    ) IN (VALUES {','.join(f'({",".join("?" * len(t))})' for t in values)})
"""

以下のように展開されます:

SELECT *
FROM RoadSegmentDistribution
WHERE (
    Source, Destination
) IN (VALUES (?,?),(?,?),(?,?),(?,?),(?,?))

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=285115&siteId=1