SQLAlchemy 等效于 ActiveRecord 中的命名范围

Posted

技术标签:

【中文标题】SQLAlchemy 等效于 ActiveRecord 中的命名范围【英文标题】:SQLAlchemy equivalent of named scopes in ActiveRecord 【发布时间】:2013-01-30 08:53:09 【问题描述】:

是否存在与 AR 的命名范围等效的功能?命名范围基本上是过滤器,可以包装在方法中,然后链接。

这是来自http://archives.ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know的示例:

class Article < ActiveRecord::Base

  # Get all articles that have been published
  named_scope :published, :conditions => ['published = ?', true]

  # Get all articles that were created recently
  named_scope :recent, lambda   :conditions => ['created_at >= ?', 1.week.ago]  

end

# Get all recently created articles that have been published
Article.published.recent

这是一个使用 Django ORM 的示例:http://furrybrains.com/2009/06/22/named-scopes-for-django/

【问题讨论】:

【参考方案1】:

SQLAlchemy 有 hybrid attributes,您可以使用它来构建任何类型的系统:

from sqlalchemy.ext.hybrid import hybrid_property


class Article(Base):
    @hybrid_property
    def published(self):
        return self.is_published == True

    @hybrid_property
    def recent(self):
        # this relies on the date arithmetic of the target backend
        return datetime.now() - self.created_at >= datetime.timedelta(days=7)


articles = query(Article).filter(Article.published, Article.recent).all()

【讨论】:

这似乎不对。它似乎是在进行内存比较,而不是为了优化查询而改变 SQL 本身 @PeterEhrlich 这就是它看起来的样子,但是如果您从中调用方法的对象是 Article 类,而不是 Article 对象,那么这些操作只会产生 SQL 表达式。阅读hybrid attributes了解更多详情。

以上是关于SQLAlchemy 等效于 ActiveRecord 中的命名范围的主要内容,如果未能解决你的问题,请参考以下文章

Postgres中'money'和'OID'的sqlalchemy等效列类型是啥?

SQLAlchemy 是不是与 Django 的 get_or_create 等效?

SQLAlchemy 是不是与 Django 的 get_or_create 等效?

如何使用 SqlAlchemy 按 id 查询数据库?

在执行 SQLAlchemy update() 之后,有没有办法获取更改的值?

将 LIMIT 和 OFFSET 应用于 SQLAlchemy 中的所有查询