Агрегированное выражение функции помещается в предложение `FROM` - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь встроить запрос в модель (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?

1 Ответ

0 голосов
/ 09 ноября 2018

вместо

func.sum(LoanPayout.principal).alias('loan_payout_total')

Вы хотите ярлык :

func.sum(LoanPayout.principal).label('loan_payout_total')

FunctionElement.alias() создает псевдоним FROM -элемент, поэтому он включен в предложение FROM. Это действует, например, в Postgresql.

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