SQLAlchemy查询使用包含,数组转换和子查询

时间:2015-09-02 18:38:40

标签: python postgresql sqlalchemy

将非常感谢将以下查询转换为SQLAlchemy查询的任何帮助:

select * from app where (select app_ids from user where user_id=12345) @> array[app_id];
    app中的
  • app_id是一个int列
  • user中的app_ids是一个int []列
  • user中的user_id是一个int列

我尝试了很多配方,但都因为某种原因而失败,这是一个失败的例子,因为ARRAY对象不具备contains_by方法:

subq = self.session.query(objects.User.app_ids).filter(objects.User.user_id == 12345).subquery('subq')

self.session.query(objects.App).filter(postgresql.ARRAY(objects.App.app_id).contained_by(subq.c.app_ids)).all()

我还尝试了以下等效的原始查询而没有任何运气。也许这些翻译会更容易?

select * from app where array[app_id] <@ (select app_ids from user where user_id=12345);


select * from app where app_id=ANY((select app_ids from user where user_id=12345)::integer[]);

所有这些原始查询在postgres中都能正常运行。

感谢。

1 个答案:

答案 0 :(得分:2)

计算出任何()公式,这对于任何大量的条目都是最好的:

subq = session.query(objects.User.app_ids).filter(objects.User.user_id == 12345)

results = session.query(objects.App).filter(
   objects.App.id == sqlalchemy.func.any(sqlalchemy.cast(subq.as_scalar(), postgressql.ARRAY(sqlalchemy.Integer))
)