Как считать элементы дочерней таблицы с или без объединения с родительской таблицей, используя SQLAlchemy? - PullRequest
0 голосов
/ 26 января 2019

Я использовал SQLAlchemy для создания базы данных SQLite, в которой хранятся библиографические данные какого-либо документа, и я хочу запросить номер автора каждого документа.

Я знаю, как это сделать в сыром SQL, но как я могу достичь того же результата, используя SQLAlchemy? Это возможно без использования join?

Вот классы, которые я определил:


    class WosDocument(Base):
        __tablename__ = 'wos_document'

        document_id = Column(Integer, primary_key=True)
        unique_id = Column(String, unique=True)
        ......
        authors = relationship('WosAuthor', back_populates='document')

    class WosAuthor(Base):
        __tablename__ = 'wos_author'

        author_id = Column(Integer, primary_key=True, autoincrement=True)

        document_unique_id = Column(String, ForeignKey('wos_document.unique_id'))
        document = relationship('WosDocument', back_populates='authors')

        last_name = Column(String)
        first_name = Column(String)

И моя цель - получить тот же результат, что и этот SQL-запрос:


     SELECT a.unique_id, COUNT(*) 
     FROM wos_document AS a 
     LEFT JOIN wos_author AS b 
     ON a.unique_id = b.document_unique_id 
     GROUP BY a.unique_id

Я попробовал коды ниже:


    session.query(WosDocument.unique_id, len(WosDocument.authors)).all()

    session.query(WosDocument.unique_id, func.count(WosDocument.authors)).all()

Первая строка вызвала ошибку, вторая строка не дает мне желаемого результата, она возвращает только одну строку, и я не узнаю, что это такое:

[('000275510800023', 40685268)]

Поскольку WosDocument Объект имеет отношение один ко многим authors, я предположил, что могу запросить номер автора каждого документа без явного использования join, но я не могу выяснить, как это сделать с помощью SQLAlchemy.

Вы можете мне помочь? Спасибо!

1 Ответ

0 голосов
/ 26 января 2019

Если вы написали правильное отношение в вашей модели. Тогда запрос будет выглядеть так:

db.session.query(ParentTable.pk,func.count('*').label("count")).join(Childtable).group_by(ParentTable).all()

Деталь документа join() является https://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

Если вы не join() явно, вам придется иметь дело с чем-то вроде parent.relations в качестве поля.

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