Sqlalchemy многие ко многим присоединиться, сосчитать определенный столбец - PullRequest
0 голосов
/ 04 сентября 2018

Я следовал некоторым учебникам, чтобы установить отношения многие ко многим с 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 (это частично обходит отношения)

Хотите узнать, есть ли у кого-нибудь лучшее решение для выполнения этой довольно простой задачи подсчета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...