简体   繁体   English

一个查询中的 flask + sqlAlchemy COUNT、AVG 和 SUM

[英]flask + sqlAlchemy COUNT, AVG and SUM in one query

Checked the sqlAlchemy docs but cannot see example of multiple columns query with filter and using FUNC.检查了sqlAlchemy文档,但看不到带有过滤器和使用 FUNC 的多列查询示例。 How to compose a query based on my model to return result like this:如何根据我的模型编写查询以返回如下结果:

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

Please see below my model, and query functions, one with Class other with session, still unsure which one I should be using in this case.请参阅下面我的模型和查询函数,其中一个带有 Class 另一个带有会话,但仍然不确定在这种情况下我应该使用哪一个。 Both result in printing the query syntax.两者都会导致打印查询语法。

Model:模型:

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:应用程序:

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

html: 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-->
...      

What am I missing?我错过了什么?

Found this Docs .找到了这个文档 If no better answer provided, I will accept this.如果没有提供更好的答案,我会接受这个。

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()

App:应用程序:

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

Then html:然后是 html:

{{ sum_avg_cnt.a_cnt }}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM