我有三列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()
基于列表的长度,但我会明白这一点,一旦我知道该怎么做替换用一个固定长度的列表。
我会怎么做呢?
使用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] 删除。
我来说两句