2016-10-07 3 views
1

Я написал эту функцию питона для запроса базы данных с помощью пакета SQLAlchemy:группы по нескольким столбцам в 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 

Эта функция также делает прекрасную работу группирования мой запрос двумя переменными моего выбора.

Как я могу изменить эти функции, чтобы принять динамическое количество групповых байтов?

Спасибо!

+0

Вы пробовали '.group_by (* GroupBy)'? –

+0

Да, спасибо за кучи, это то, чем я был! – efbbrown

ответ

0

Это, как вы можете разобрать динамический ряд аргументов 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) 
Смежные вопросы