【问题标题】:How to query a SQLite database using values from a Python list?如何使用 Python 列表中的值查询 SQLite 数据库?
【发布时间】:2021-05-20 13:37:25
【问题描述】:

这是特定于 Python 的,因此 this 并不完全有帮助。

我有一个 id 列表

[120931, 129301923, 1293019, 193923, 42939]

而不是为每个命令运行一个命令,例如

for row in c.execute(f'SELECT * from sdk WHERE app = 120931'):
    print(row)

我想传入“app”的整个 id 列表并获取这些 id 出现的每一行。与下面类似,但是在查询中有一个变量(python 列表)

for row in c.execute(f'SELECT * from sdk WHERE app IN (120931, 129301923, 1293019, 193923, 42939)'):
    print(row) # passes entire list in parens but as a Python variable

我尝试过字符串插值,但它不起作用。

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

    您可以使用 str.join 为 sql IN 语句提供正确的格式:

    apps = [120931, 129301923, 1293019, 193923, 42939]
    c.execute(f'SELECT * from sdk WHERE app IN ({", ".join(map(str, apps))})')
    

    但是,如果apps 包含字符串值,您可以在语句中使用? 表示法。这样,您就可以让 sqlite3 处理语句的正确格式:

    c.execute(f'SELECT * from sdk WHERE app IN ({", ".join(["?"]*len(apps))})', apps)
    

    【讨论】:

    • ? 表示法也比SQL injection 更安全。它也适用于 OPs 整数(我开始编写自己的答案,直到我意识到您也涵盖了参数化查询)。事实上,如果列表的值之一是None,参数化查询也将避免爆炸,这需要null,而不是非参数化查询中的'None'
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2019-08-24
    • 2020-07-30
    相关资源
    最近更新 更多