使用SQLAlchemy按多列分组

4

我已经编写了这个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
你尝试过使用.group_by(*groupby)吗? - S. de Melo
1
是的,非常感谢,这正是我想要的! - Eugene Brown
1个回答

4
这是您可以解析动态数量的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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接