如何在SQLAlchemy中将Python列表与Postgres数组进行比较?

时间:2015-05-31 18:28:41

标签: python postgresql sqlalchemy

我的PSQL表类型数组中有一个整数类型的列,让我们调用tags列。我有一个类型为整数的Python列表,让我们来看看。称之为categories

如果tags列与categories数组有一个或多个匹配的整数,我如何运行SQLAlchemy查询以便返回表中的任何行?

3 个答案:

答案 0 :(得分:3)

假设categories的列表不是很大,这是使用每个类别的OR any(...)进行处理的一种方式:

q = db.session.query(MyTable)
clauses = [MyTable.tags.any(cat_id) for cat_id in categories]
q = q.filter(db.or_(*clauses))
for r in q.all():
    print(r)

答案 1 :(得分:1)

只需使用记录在案herein_即可。在他们的例子中

  

query.filter(User.name.in _([' ed',' wendy',' jack'])

列表['ed, 'wendy', 'jack']是您的categories,而不是User.name您使用的是您的表格和tags列。

希望它有所帮助。

答案 2 :(得分:1)

接近一个相同的问题,我发现in_运算符(标记为答案)不起作用:我得到了一个"格式错误的ARRAY字面值"错误(注意:在String类型的列上给出过滤器的示例,而不是ARRAY类型的列) @van发起了对我有用的方法。但是,在我的情况下,db对象没有or_属性。为了让它工作,我只是直接从SQLAlchemy导入or_:

from sqlalchemy import or_
# ...
q = db.session.query(MyTable)
clauses = [MyTable.tags.any(cat_id) for cat_id in categories]
q = q.filter(or_(*clauses))
for r in q.all():
    print(r)

Upvotes属于@van(我已经评论过他,但没有声誉 - 对不起面包车。)