在将代码移至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)))
非常感谢您的帮助-谢谢!
答案 0 :(得分:2)
为了在SQL Expression Language中将Python值作为SQL文字进行操作,必须将其用literal()
包装。然后可以将生成的构造用于生成所需的IN
子句:
literal(team_abbreviation).in_([tbl_pbp.c.home_team, tbl_pbp.c.away_team])
这等效于产生一堆与OR
结合的相等性检查,如注释中所述。在这种情况下,in_()
的唯一参数应该是适当的序列,例如列表。
请注意,in_
是SQLAlchemy构造的方法,而不是Python运算符in
,由于操作符如何处理,因此不能重载以生成自定义构造返回值__contains__()
:它隐式转换为bool
:
In [1]: class X:
...: def __contains__(self, item):
...: return 'nope'
...:
In [2]: 1 in X()
Out[2]: True