使用SQLAlchemy动态column_property

Jér*_*eot 4 python sqlalchemy count

我有一些SA模型,需要一些技巧:

class Entry(Base):
    __tablename__ = 'entry'
    id = Column(Integer, primary_key=True)
    title = Column(Unicode(255))
    author_id = Column(Integer, ForeignKey('user.id'))
    date = Column(DateTime)
    content = Column(Text)
    author = relationship('User', backref='entries')

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    username = Column(Unicode(255))
    ...
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这是非常经典的,用户写条目...我需要渲染一些关于它们的统计数据(比如每周/每月显示它们的条目......)

对于计数条目,我将column_property添加到用户模型,如下所示:

class User(Base):
    ...
    entries_count = column_property(select([func.count(Entry.id)]).\
                                            where(Entry.author_id==id))
Run Code Online (Sandbox Code Playgroud)

这让我可以看到用户已经写了多少条目.但是为了给出一些日期范围的统计数据,我需要动态调整entries_count以添加日期标准.

所以问题是:你将如何管理日期标准?column_property是满足这种需求的最佳解决方案吗?

谢谢你提前.

Den*_*ach 7

添加属性是获取与对象相关的某些数据库状态的好方法.但是使用外部标准参数,计数不仅仅是一个状态,而是一个函数.将对象属性等数据表示为不好.因此,直接查询其他数据(计算比start_date以下所有示例更新的antries ):

session.query(User, func.count(Entry.id))\
    .outerjoin((Entry, (Entry.author_id==User.id) & (Entry.date>start_date)))\
    .group_by(User.id)
Run Code Online (Sandbox Code Playgroud)

或者在User类中定义一个辅助方法(而不是属性!)以简化用法:

class User(Base):
    # ...
    @classmethod
    def entries_count(cls, cond):
        return select([func.count(Entry.id)])\
                .where((Entry.author_id==cls.id) & cond)\
                .as_scalar()

session.query(User, User.entries_count(Entry.date>start_date))
Run Code Online (Sandbox Code Playgroud)