flask + sqlAlchemy COUNT, AVG и SUM в одном запросе - PullRequest
0 голосов
/ 26 февраля 2020

Проверил документы sqlAlchemy, но не вижу примера запроса нескольких столбцов с фильтром и использованием FUN C. Как составить запрос, основанный на моей модели, для получения результата, подобного следующему:

SELECT 
COUNT(amount)a_cnt,
SUM(amount)a_sum,
AVG(amount)a_avg
FROM public.transaction
WHERE acc_id = 1
AND "traDate" >= '2019-11-20'
AND "traDate" <= '2019-12-01'

******************
a_cnt || a_sum || a_avg
------------------------
3     || 12    || 4

Пожалуйста, смотрите ниже мою модель, и функции запросов, одна с классом, другая с сессией, все еще не уверены, какой из них мне следует использовать в этот случай. Оба результата приводят к печати синтаксиса запроса.

Модель:

class Transaction(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    traDate = db.Column(db.Date, nullable=False)
    amount = db.Column(db.Float, nullable=False)
    desc = db.Column(db.String, nullable=False)
    card = db.Column(db.String(1), nullable=False)
    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'), nullable=True)
    acc_id = db.Column(db.Integer, db.ForeignKey('account.id'), nullable=False)
    uplDate = db.Column(db.DateTime, nullable=False, default=datetime.now)

### this?
    def sum_filtered(account_id, date_from, date_to):
        return db.session.query(db.func.count(Transaction.amount).label('a_cnt'), db.func.sum(Transaction.amount).label('a_sum'), db.func.avg(Transaction.amount).label('a_avg')).filter_by(acc_id = account_id).filter(Transaction.traDate >= date_from, Transaction.traDate <= date_to)

### OR this?
    def sum_filtered(account_id, date_from, date_to):
        return Transaction.query.with_entities(func.sum(Transaction.amount).label('a_sum')).filter_by(acc_id = account_id).filter(Transaction.traDate >= date_from, Transaction.traDate <= date_to)

Приложение:

@app.route(...)
templateData = {
    ...
    'total_amnt' : model.Transaction.sum_filtered(accountid, f_from, f_to),
    ...
}
return render_template('/list.html', **templateData)

html:

...
<span class="input-group-text">Total £{{ total_amnt }}</span><!-- shows the query syntax-->
<span class="input-group-text">Total £{{ total_amnt.a_sum }}</span><!-- shows nothing-->
...      

Что я скучаю?

1 Ответ

0 голосов
/ 27 февраля 2020

Нашли Документы . Если лучшего ответа нет, я приму это.

def sum_filtered(account_id, date_from, date_to):
    result = db.session.execute('SELECT COUNT(amount)a_cnt, AVG(amount)a_avg, SUM(amount)a_sum FROM transaction WHERE acc_id = :p1 AND "traDate" BETWEEN :p2 AND :p3',{'p1' : account_id, 'p2' : date_from, 'p3' : date_to})
    return result.fetchone()

Приложение:

        'sum_avg_cnt' : model.Transaction.sum_filtered(accountid, f_from, f_to),

Тогда html:

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