SQLAlchemy其中列列表中的值

时间:2018-12-28 14:38:34

标签: python mysql sqlalchemy

在将代码移至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)))

非常感谢您的帮助-谢谢!

1 个答案:

答案 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