Я пытаюсь встроить запрос в модель (Loan
), отфильтрованную по некоторым критериям и объединенную в другую модель (LoanPayment
).
Первая модель имеет отношение один ко многим со второй, и я хотел бы собрать совокупное значение по столбцу второй модели.
Модели определены так:
class Loan(Base):
__tablename__ = 'loan'
id = Column(Integer, primary_key=True)
granted_date = Column(Date, nullable=False)
state = Column(String(50), default='GRANTED', index=True)
value = Column(Numeric(19, 10, asdecimal=True),
nullable=False, default=money.Decimal(0))
[... other columns ...]
class LoanPayout(Base):
__tablename__ = 'loan_payout'
id = Column(Integer, primary_key=True)
payment_date = Column(Date, nullable=False)
value = Column(Numeric(19, 10, asdecimal=True),
nullable=False, default=money.Decimal(0))
loan_id = Column(Integer, ForeignKey('loan.id'),
nullable=False, index=True)
loan = relationship('Loan',
backref=backref('payouts', lazy='dynamic',),
foreign_keys=[loan_id], order_by=payment_date.asc)
[... other columns ...]
Я хотел бы запросить все записи Loan.granted_date
, отфильтровав их по определенным критериям (скажем, state='LATE'
), а также вернуть sum()
значений всех связанных выплат, сгруппированных по ссуде.
Я пробовал следующий запрос orm:
session.query(
Loan.id,
Loan.granted_date,
func.sum(LoanPayout.principal).alias('loan_payout_total'),
).filter(
Loan.state == 'LATE',
).join(
LoanPayout
).group_by(Loan.id)
Но SQLAlchemy (версия 1.2.13) отображает следующее, что даже не является допустимым SQL:
SELECT
loan.id AS loan_id,
loan.sale_date AS loan_sale_date,
loan_payout_total.sum_1 AS loan_payout_total_sum_1
FROM
sum(loan_payout.principal) AS loan_payout_total,
loan
JOIN loan_payout
ON loan.id = loan_payout.loan_id
WHERE
loan.state = %(state_1)s
GROUP BY
loan.id
Запрос - почти то, что я ожидал: он правильно объединяет две таблицы, правильно отображает столбец sum()
и группирует по ожидаемому столбцу.
Но он помещает столбец sum()
с псевдонимом в раздел FROM
вместо раздела SELECT
:
FROM
sum(loan_payout.principal) AS loan_payout_total,
loan
И затем он помещает столбец с псевдонимами, предположительно происходящий из этого странного «выбираемого», в предложение SELECT
:
loan_payout_total.sum_1 AS loan_payout_total_sum_1
Как мне заставить SQLAlchemy правильно отобразить этот запрос, используя поддержку ORM?