我有一个包含三列的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
考虑到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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。