首页 > 解决方案 > 在 Python 3 和 SQLite 中使用多个“WHERE IN”,同时使其可读

问题描述

我设法让一个WHERE IN工作,但它看起来很可怕,我无法弄清楚如何添加第二个WHERE IN。我目前有这个,它正在工作:

selected_years = ['2018', '2019']
cur.execute(
    "SELECT * FROM journal WHERE year IN (%s) ORDER BY date" % ','.join(
        '?' * len(selected_years)
    ),
    selected_years
)
return cur.fetchall()

但是,我真的不喜欢它的外观,它不可读并且看起来很原始,必须有一种使用更新的 Python 3 方式的方法,例如使用 f-stringsf"String to format {variable_name}"

最重要的是,我需要添加另一个过滤器,如下所示:

SELECT * FROM journal WHERE year IN ('2018', '2019') AND month IN ('01', '04', '11') ORDER BY date

我设法使它与 2 个过滤器一起工作,但是以一种狡猾的方式,没有将 vars 作为第二个参数发送。此外,当列表仅包含一个元素时,它会崩溃,因为元组的格式如下:WHERE year in (2018,)带有额外的逗号。

selected_years = tuple(selected_years)
selected_months = tuple(selected_months)
cur.execute(f"-- SELECT * FROM journal WHERE year IN {selected_years} AND month IN {selected_months} ORDER BY date")

任何人都可以推荐一种仍然可读的更新方式?我只能在 2008-2012 年使用 Python 2.7 在 Stack Overflow 上找到旧答案

标签: pythonpython-3.xsqlite

解决方案


您可以尝试以下操作,假设您使用的是 pymysql

cur.execute("SELECT * FROM journal WHERE year IN %s AND month IN %s ORDER BY date", (selected_years, selected_months))

推荐阅读