Вопрос

Я в середине преобразования старой устаревшей системы PHP в Flask + SQLAlchemy и задавался вопросом, как я построю следующее:

У меня есть модель:

class Invoice(db.Model):
   paidtodate = db.Column(DECIMAL(10,2))
   fullinvoiceamount = db.Column(DECIMAL(10,2))
   invoiceamount = db.Column(DECIMAL(10,2))
   invoicetype = db.Column(db.String(10))
   acis_cost = db.Column(DECIMAL(10,2))
.

Запрос мне нужно запустить:

SELECT COUNT(*) AS the_count, sum(if(paidtodate>0,paidtodate,if(invoicetype='CPCN' or invoicetype='CPON' or invoicetype='CBCN' or invoicetype='CBON' or invoicetype='CPUB' or invoicetype='CPGU' or invoicetype='CPSO',invoiceamount,
fullinvoiceamount))) AS amount,
SUM(acis_cost) AS cost, (SUM(if(paidtodate>0,paidtodate,invoiceamount))-SUM(acis_cost)) AS profit FROM tblclientinvoices
.

Есть ли sqlalchemyish способ построить этот запрос?- Я попробовал Googling для MySQL, если статирование с SQLALCHEMY, но привлекая пробелы.

Большое спасибо!

Это было полезно?

Решение

Используйте func (документация) Для генерации функции SQL функция:

qry = select([
        func.count().label("the_count"),

        func.sum(func.IF(
            Invoice.paidtodate>0,
            Invoice.paidtodate,
            # @note: I prefer using IN instead of multiple OR statements
            func.IF(Invoice.invoicetype.in_(
                    ("CPCN", "CPON", "CBCN", "CBON", "CPUB", "CPGU", "CPSO",)
                ),
                Invoice.invoiceamount,
                Invoice.fullinvoiceamount)
            )
        ).label("amount"),

        func.sum(Invoice.acis_cost).label("Cost"),

        (func.sum(func.IF(
            Invoice.paidtodate>0,
            Invoice.paidtodate,
            Invoice.invoiceamount
            ))
            - func.sum(Invoice.acis_cost)
        ).label("Profit"),
    ],
)

rows = session.query(qry).all()
for row in rows:
    print row
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top