Подсчет отношений в SQLAlchemy
Моя структура SQLAlchemy выглядит следующим образом
papers2authors_table = Table('papers2authors', Base.metadata,
Column('paper_id', Integer, ForeignKey('papers.id')),
Column('author_id', Integer, ForeignKey('authors.id'))
)
class Paper(Base):
__tablename__ = "papers"
id = Column(Integer, primary_key=True)
title = Column(String)
handle = Column(String)
authors = relationship("Author",
secondary="papers2authors",
backref="papers")
class Author(Base):
__tablename__ = "authors"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
code = Column(String, unique=True)
Я хотел бы запросить две вещи:
- Количество авторов в каждой статье
- Количество работ каждого автора (частично ответ здесь)
Я перепробовал много вариантов с func.count()
а также count()
, но они возвращают бессмысленные результаты. Как сделать эти две вещи способом SQLAlchemy?
Что я пробовал
db.s.query(func.count(core.Paper.id)).group_by(core.Author.id).first()
знак равноsqlalchemy.exc.OperationalError: (OperationalError) no such column: authors.id
db.s.query(func.count(core.Author.papers)).group_by(core.Author.id).first()
знак равно(128100)
что не то, что я ожидалdb.s.query(core.Author.papers).group_by(core.Author.id).count().first()
знак равноAttributeError: 'int' object has no attribute 'first'
- ...
1 ответ
Решение
Нашли решения:
- Количество авторов каждого документа:
db.s.query(core.Paper.title, func.count(core.Author.id)).join(core.Paper.authors).group_by(core.Paper.id).all()
- Количество работ каждого автора:
db.s.query(core.Author.name, func.count(core.Author.id)).join(core.Author.papers).group_by(core.Author.id).all()
Соответствующий: http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html