使用SQLAlchemy动态column_property

时间:2011-03-26 16:10:31

标签: python count sqlalchemy

我有一些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))
    ...

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

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

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

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

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

先谢谢。

1 个答案:

答案 0 :(得分: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)

或者在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))