一次查询多个值

时间:2013-03-07 09:42:28

标签: sqlalchemy

在SQL中,我可以得到一组这样的行:

SELECT * FROM table WHERE id in (2,3,5,7,11);

等效的sqlalchemy查询如何显示? cls.id in [2,3,5,7,11]评估为False,因此此代码:

q = meta.Session.query(cls)
q = q.filter(cls.id in [2,3,5,7,11])
return q.all()

失败,但有例外:

  File "foo.py", line 1234, in findall_by_ids
    q = q.filter(cls.id in [2,3,5,7,11])
  File "<string>", line 1, in <lambda>
  File "/eggs/sqlalchemy/orm/query.py", line 50, in generate
    fn(self, *args[1:], **kw)
  File "/eggs/sqlalchemy/orm/query.py", line 1177, in filter
    "filter() argument must be of type "
ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement
               or string

3 个答案:

答案 0 :(得分:13)

使用in_

q.filter(cls.id.in_([2, 3, 5, 7, 11]))

你的翻译说:

ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement
               or string

这些操作符已被覆盖并将返回过滤器所需的内容,您可以查看sqlalchemy.sql.operatorscls.id in [2, 3, 5, 7, 1]不起作用的原因是因为in是[2,3,5,7,1]的运算符,它将返回True或{{1} }。

答案 1 :(得分:3)

使用in_,如下所示:

q = meta.Session.query(cls)
q = q.filter(cls.id.in_([2,3,5,7,11]))
return q.all()

答案 2 :(得分:1)

如果您不了解PK列,那么最佳解决方案是使用get,但是将其用于一行。

对于非复合PK

pk = model.__mapper__.primary_key[0]
items = model.query.filter(pk.in_(ids)).all()