Я пытаюсь выполнить простой запрос, чтобы получить количество писем, полученных от людей.
Модель данных выглядит следующим образом:
class Email(Base):
__tablename__ = "Email"
id = Column(Integer, primary_key=True)
author = Column(None, ForeignKey(Author.id))
content = Column(String(500))
date = Column(DateTime)
class Author(Base):
__tablename__ = "Author"
id = Column(Integer, primary_key=True)
name = Column(String(500))
Сначала я не получил значения для авторов, которые не отправляли электронные письма:
session.query(Author.name, func.count(Email.author)).outerjoin(Email).group_by(Author.name).all()
[('James', 1), ('John', 10), ('Jack', 0)]
Однако я подумал, что внешнее соединение может мне помочь. Запустив следующий запрос, мне удалось узнать количество писем, связанных с каждым автором:
session.query(Author.name, func.count(Email.author)).outerjoin(Email).group_by(Author.name).all()
[('James', 1), ('John', 10), ('Jack', 0)]
Но если я попытаюсь добавить условие фильтра, нулевое значение исчезнет ...
session.query(Author.name, func.count(Email.author)).filter(Mail.date >= '2017-02-01').outerjoin(Email).group_by(Author.name).all()
[('James', 1), ('John', 10)]
Я не понимаю, почему фильтр удалит автора без электронной почты (после того, как весь фильтр будет выполнен перед внешним соединением?).