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