sqlalchemy列列表中的值

5kgi1eie  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(365)

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

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

zysjyyx4

zysjyyx41#

为了在sql表达式语言中将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

相关问题