开发者社区> 问答> 正文

如何在Python sqlite3中使用元组选择值所在的位置?

我有一个包含三列的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

我无法像链接的答案一样手动插入值,因为我不知道list参数包含什么。这意味着我需要根据列表的长度执行某种“”,.. join()`的操作,但是一旦我知道如何用固定长度的列表进行替换,我就会明白这一点。

我该怎么做?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 20:27:01 1083 0
1 条回答
写回答
取消 提交回答
  • 考虑到SQL引擎缺乏对基于容器的占位符的本地支持,使用str.join方法确实是实现此目的的好方法:

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

    回答来源:stackoverflow

    2020-03-24 20:27:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载