如何选择其中使用Python sqlite3的元组值?

jmkjaer:

我有三列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 (?,?),(?,?),(?,?),(?,?),(?,?))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章