在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
答案 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.operators
。 cls.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()