Подсчет отношений в 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)

Я хотел бы запросить две вещи:

  1. Количество авторов в каждой статье
  2. Количество работ каждого автора (частично ответ здесь)

Я перепробовал много вариантов с 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 ответ

Решение

Нашли решения:

  1. Количество авторов каждого документа: db.s.query(core.Paper.title, func.count(core.Author.id)).join(core.Paper.authors).group_by(core.Paper.id).all()
  2. Количество работ каждого автора: 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

Другие вопросы по тегам