您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

SQLAlchemy-可以向查询对象添加自定义方法吗?

SQLAlchemy-可以向查询对象添加自定义方法吗?

您可以对基@H_419_1@Query类进行子类化以添加自己的方法

@H_419_1@from sqlalchemy.orm import Query

class MyQuery(Query):

  def all_active(self):
    return self.filter(User.is_active == True)

然后,您可以在创建会话时告诉sqlAlchemy使用此新查询类(此处的文档)。从您的代码看来,您可能正在使用Flask- sqlAlchemy,因此您可以按照以下步骤进行操作:

@H_419_1@db = sqlAlchemy(session_options={'query_cls': MyQuery})

否则,您将参数直接传递给@H_419_1@sessionmaker:

@H_419_1@sessionmaker(bind=engine, query_cls=MyQuery)

到目前为止,这个新的查询对象并不那么有趣,因为我们@H_419_1@User在方法中对类进行了硬编码,因此它不能用于其他任何事情。更好的实现方式是使用查询的基础类来确定要应用的过滤器。这有点棘手,但也可以完成:

@H_419_1@class MyOtherQuery(Query):

  def _get_models(self):
    """Returns the query's underlying model classes."""
    if hasattr(query, 'attr'):
      # we are dealing with a subquery
      return [query.attr.target_mapper]
    else:
      return [
        d['expr'].class_
        for d in query.column_descriptions
        if isinstance(d['expr'], Mapper)
      ]

  def all_active(self):
    model_class = self._get_models()[0]
    return self.filter(model_class.is_active == True)

最后,动态关系不会使用此新查询类(如果有的话)。为了让那些人也可以使用它,可以在创建关系时将其作为参数传递:

@H_419_1@users = relationship(..., query_class=MyOtherQuery)
SQLServer 2022/1/1 18:29:45 有493人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶