在sqlalchemy

时间:2016-10-07 11:56:19

标签: python sqlalchemy

我已经编写了这个python函数来使用SQLAlchemy包查询数据库:

def group_by_one_var(start_date, end_date, groupby):
    data = db.session.query(
        groupby,
        MyModel.SnapDate,
        func.count(MyModel.CustomerID).label("TotalCustomers")
    )\
    .filter(
        MyModel.SnapDate >= start_date,
        MyModel.SnapDate <= end_date
    )\
    .group_by(
        groupby
    ).all()
    return(data)

test_1 = group_by_one_var("2016-08-01", "2016-08-31", MyModel.Country) # Success

通过我选择的变量对我的查询进行分组很方便。

然而,在涉及多个变量分组时,我感到困惑。

这是我用两个变量写的分组函数:

def group_by_two_vars(start_date, end_date, groupby):
    data = db.session.query(
        groupby[0],
        groupby[1],
        MyModel.SnapDate,
        func.count(MyModel.CustomerID).label("TotalCustomers")
    )\
    .filter(
        MyModel.SnapDate >= start_date,
        MyModel.SnapDate <= end_date
    )\
    .group_by(
        groupby[0]
    )\
    .group_by(
        groupby[1]
    ).all()
    return(data)

tes2 = group_by_two_vars("2016-08-01", "2016-08-31", (MyModel.Country, MyModel.Currency)) # Success

这个函数也可以通过我选择的两个变量对我的查询进行分组。

如何更改这些功能以接受动态数量的分组?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是解析动态数量的groupby参数的方法,并让SQLAlchemy将它们全部包含在查询中:

def group_by_n_vars(start_date, end_date, *groupby):
    data = db.session.query(
        *groupby,
        MyModel.BookingDateLocal,
        func.count(MyModel.BookingId).label("TotalCustomers")
    )\
    .filter(
        MyModel.SnapDate >= start_date,
        MyModel.SnapDate <= end_date
    )\
    .group_by(
        *groupby
    ).all()
    return(data)