Sqlalchemy多对多联接,计数特定列

时间:2018-09-04 18:20:51

标签: python sql sqlalchemy

我遵循了一些教程,以便与sqlalchemy建立多对多关系。这工作得很好,我能够使用这些模型正确地插入和查询数据。但是,经过大量的努力,我无法简单地获取相关列的计数作为我的查询列之一。我将不胜感激任何建议。

replications = db.Table(
    'replications',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('post_id', db.Integer, db.ForeignKey('post.id'))

)

class Post(db.Model):    
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)    
    replications = db.relationship(
        'Post',
        secondary=replications,
        backref=db.backref('replicators', lazy='dynamic'),
        lazy='dynamic'
    )

# these work
print(current_user.replications.count())
print(Post.query.get(2).replicators.count())

# these do not
db.session.query(Post.id, Post.replicators.count()) # ...
db.session.query(Post.id, func.count(Post.replicators)) # ...

为进一步说明,我想对帖子进行常规查询,对于返回的每一行,请查看具有该post_id的复制表中的行数。

我找到的最接近的解决方案是使用以下更基本的SQL:

db.session.query(Post.id, func.count(distinct(Post.replicators))).outerjoin(Post.replicators).group_by(Post.id)

这有几个问题:

  • 返回的计数都比应有的多(所有没有复制器的帖子为1,有一个为2的帖子,依此类推)
  • 性能似乎受到很大的影响
  • 似乎没有利用sqlalchemy ORM(部分回避了关系)

希望找出是否有人能够更好地执行此相当简单的计数任务。

0 个答案:

没有答案