python - 在 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 上找到旧答案
解决方案
您可以尝试以下操作,假设您使用的是 pymysql
cur.execute("SELECT * FROM journal WHERE year IN %s AND month IN %s ORDER BY date", (selected_years, selected_months))
推荐阅读
- ios - 如何将 [String] 保存到 Realm
- stripe-payments - 在 iOS 上处理 Stripe 信用卡有问题,但在 Win 和 Android 上有效
- reactjs - menuLinks.map 不是函数
- xml - 如何使用 perl 过滤带有标签的 XML 文件?
- php - Laravel faker - 为任务表生成随机 user_id
- c - 如何解释来自连接到 C 中一个套接字的多个节点的多次写入
- java - 如何在workmanager Android上传递输入数组列表
- c++ - 如何在switch中更改此语句
- xslt - Rename the root node in xml using xslt
- c# - 将 QnAMaker 路由到机器人框架中的英雄卡