python - SQLAlchemy Where 列列表中的值
问题描述
在将我的代码移动到 SQLAlchemy 之前,我有一个 MySQL 查询,它在多个列(例如 - )中查找一个值,WHERE 'value' in (col1, col2)
当手动将查询提交到数据库时它可以正常工作。
上面的用例相对简单,但将来我可能想在两个以上的列上运行类似的查询,所以现在只想解决这个问题。
目前我已将我的查询转换为以下(有效),但我试图找到与上述类似的语法。
metadata = sqlalchemy.MetaData(mydb, reflect=True)
select_stmt = (tbl_pbp.select(
((tbl_pbp.c.home_team == team_abbreviation) | (tbl_pbp.c.away_team == team_abbreviation))
& (tbl_pbp.c.is_corsi == True)))
当我尝试以下操作时,我收到一个语法错误,所以不确定这是否是in_
我尝试使用的关键字的问题。
metadata = sqlalchemy.MetaData(mydb, reflect=True)
select_stmt = (tbl_pbp.select(
(team_abbreviation in_(tbl_pbp.c.home_team, tbl_pbp.c.away_team)
& (tbl_pbp.c.is_corsi == True)))
非常感谢任何帮助 - 谢谢!
解决方案
为了在SQL 表达式语言中将 Python 值作为 SQL 文字进行操作,它必须用literal()
. 然后可以使用生成的构造来生成所需的IN
子句:
literal(team_abbreviation).in_([tbl_pbp.c.home_team, tbl_pbp.c.away_team])
正如评论中所指出的,这相当于产生一堆与 结合的相等性检查OR
。在这种情况下,唯一的参数in_()
应该是一个合适的序列,例如一个列表。
请注意,in_
这里是SQLAlchemy 构造的方法in
,而不是 Python operator ,由于它如何处理 : 的返回值,它不能被重载以生成自定义构造__contains__()
:它隐式转换为 a bool
:
In [1]: class X:
...: def __contains__(self, item):
...: return 'nope'
...:
In [2]: 1 in X()
Out[2]: True
推荐阅读
- vue.js - vuejs:如何让我的数据对道具变化做出反应?
- android - Android:尝试下载我新发布的应用程序时“从服务器 DFDFERH-01 检索信息时出错”
- c# - 从缩放的单位位图不同的场景中删除颜色渐变
- react-native - 如何在反应原生应用程序中使用 Geolocation 获取设备的当前位置
- google-cloud-platform - 具有多个应用程序和端口的 GCP 负载均衡器
- r - 在 Rcpp 中选择 NumericVector 和 arma::vec
- c# - 如何在 ASP.NET webconfig 中禁用视图状态大小限制
- python - 我可以停止 tensorflow 训练并仍然安全地关闭摘要编写器的 tfrecords 文件吗?
- xml - 使用 XSLT 删除节点中的重复值
- nltk - 如何在 NLTK/StanfordNLP/CoreNlP 中扩展/自定义命名实体?