14

在 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
4

3 回答 3

25

在_中使用

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] 的运算符,它会返回Trueor False

于 2013-03-07T09:49:08.063 回答
4

使用in_,像这样:

q = meta.Session.query(cls)
q = q.filter(cls.id.in_([2,3,5,7,11]))
return q.all()
于 2013-03-07T09:48:07.437 回答
2

如果您不知道 PK 列,最好的解决方案是使用get它,但它只用于一行。

对于非复合 PK

pk = model.__mapper__.primary_key[0]
items = model.query.filter(pk.in_(ids)).all()
于 2016-02-29T20:24:12.680 回答