0%

sqlalchemy中any()和has()的用法

sqlalchemy.orm.RelationshipProperty.Comparator.any(criterion=None, **kwargs)

生成一个表达式,使用exists根据特定条件测试集合。

像这样的表达:

1
2
3
session.query(MyClass).filter(
MyClass.somereference.any(SomeRelated.x==2)
)

将生成如下查询:

1
2
3
SELECT * FROM my_table WHERE
EXISTS (SELECT 1 FROM related WHERE related.my_id=my_table.id
AND related.x=2)

因为Comparator.any()使用关联子查询,查询大表时它的性能不如使用join好。

Comparator.any()对于测试空集合特别有用:

1
2
3
session.query(MyClass).filter(
~MyClass.somereference.any()
)

将生成:

1
2
3
SELECT * FROM my_table WHERE
NOT (EXISTS (SELECT 1 FROM related WHERE
related.my_id=my_table.id))

Comparator.any()仅对集合有效,即有uselist=True的relationship()。对于标量引用,要使用Comparator.has()。

sqlalchemy.orm.RelationshipProperty.Comparator.has(criterion=None, **kwargs)

生成一个表达式,使用exists根据特定条件测试标量引用。

像这样的表达:

1
2
3
session.query(MyClass).filter(
MyClass.somereference.has(SomeRelated.x==2)
)

将生成如下查询:

1
2
3
SELECT * FROM my_table WHERE
EXISTS (SELECT 1 FROM related WHERE
related.id==my_table.related_id AND related.x=2)

因为Comparator.has()使用关联子查询,查询大表时它的性能不如使用join好。

Comparator.has()仅对标量引用有效,即有uselist=False的relationship()。对于集合引用,要使用 Comparator.any()。

参考文档

https://docs.sqlalchemy.org/en/13/orm/internals.html#sqlalchemy.orm.RelationshipProperty