Session.query_property
在 SQLAlchemy 中可以使用 session 的方法query_property
方便的使用自定义的 query 类 [1].
以下是官方的示例代码
1 | Session = scoped_session(sessionmaker()) |
query_property
接收一个参数cls
, 指定自定义的Query class (用户从sqlalchemy.orm.Query
继承的子类), 而不是默认的Query.
示例
1 | from sqlalchemy.orm import Query |
以上的方法可以完成一些基本的需求, 但是问题是MyClass.query
的类定义时和Session耦合在一起了.
假如我想使用自定义的Query类, 使用query构造出查询条件后,需要应用到不同的session上
(也许几个session代表不同的数据库连接), 这就要求My Class.query
在定义时需要与
Session解耦, 最后使用query.with_session
方法将query绑定到session上应用查询.
自定义Query类, 与Session解耦
1 | 例子使用了__init_subclass__方法, 要求python3.6+. 3.6之前的版本需要进行相应的修改. |
1 | from sqlalchemy import ( |
首先定义自己的Query继承关系, BaseQuery继承orm.Query
, 每个model如果需要有自己的特定查询类则继承BaseQuery. 在User中使用query_cls
指定特定的查询类, 不定义则使用默认的BaseQuery.
核心点在于User模型继承了QueryPropertyMixin
, 在QueryPropertyMixin
使用了__init_subclass__
方法控制子类在初始化时生成query
对象.这样User.query
对象就与session解耦, 在之后就使用with_session
与具体session绑定进行查询了.
例子中还演示了如何在model类定义中一个default_filters, 代表某些情况中需要使用的 filters, 方便查询特定条件的对象.