SqlAlchemy - func sum 的多列
SqlAlchemy - Multiple Columns for func sum
目前我使用的查询如下:
Model.query.with_entities(Model.m_t,
func.sum(Model.a),func.sum(Model.b),
func.sum(Model.c),func.sum(Model.d),
func.sum(Model.f)).group_by(Model.g).\
filter(*queries).paginate(page_number, page_size, False
)
尽管这按预期工作,但如您所见,如果列数增加(for func sum),代码会变得重复。
搜索了一段时间后,我想到了这个:
col_headers = ["a", "b", "c", "d", "f"]
search_columns = [getattr(Model, i) for i in col_headers]
Model.query.with_entities(Model.m_t,
func.sum(*search_columns)).group_by(Model.g).\
filter(*queries).paginate(page_number, page_size, False
)
但这并不像预期的那样有效。我收到以下错误
can't adapt type 'InstrumentedAttribute' Exception as not enough
values to unpack (expected 3, got 2)
我知道我漏掉了一些小东西。感谢您的帮助!
- 您应该将
sum
分别应用于每一列:
search_columns = [db.func.sum(getattr(Model, i)) for i in col_headers]
- 您可以使用
Query.add_columns
向查询结果添加列:
query = query.add_columns(*search_columns)
或者您可以直接传递它们:
Model.query.with_entities(Model.m_t, *search_columns)
综合起来:
col_headers = ["a", "b", "c", "d", "f"]
search_columns = [db.func.sum(getattr(Model, i)) for i in col_headers]
query = (
Model.query.with_entities(Model.m_t, *search_columns)
.group_by(Model.g)
.filter(*queries)
.paginate(page_number, page_size, False)
)
目前我使用的查询如下:
Model.query.with_entities(Model.m_t,
func.sum(Model.a),func.sum(Model.b),
func.sum(Model.c),func.sum(Model.d),
func.sum(Model.f)).group_by(Model.g).\
filter(*queries).paginate(page_number, page_size, False
)
尽管这按预期工作,但如您所见,如果列数增加(for func sum),代码会变得重复。 搜索了一段时间后,我想到了这个:
col_headers = ["a", "b", "c", "d", "f"]
search_columns = [getattr(Model, i) for i in col_headers]
Model.query.with_entities(Model.m_t,
func.sum(*search_columns)).group_by(Model.g).\
filter(*queries).paginate(page_number, page_size, False
)
但这并不像预期的那样有效。我收到以下错误
can't adapt type 'InstrumentedAttribute' Exception as not enough values to unpack (expected 3, got 2)
我知道我漏掉了一些小东西。感谢您的帮助!
- 您应该将
sum
分别应用于每一列:
search_columns = [db.func.sum(getattr(Model, i)) for i in col_headers]
- 您可以使用
Query.add_columns
向查询结果添加列:
query = query.add_columns(*search_columns)
或者您可以直接传递它们:
Model.query.with_entities(Model.m_t, *search_columns)
综合起来:
col_headers = ["a", "b", "c", "d", "f"]
search_columns = [db.func.sum(getattr(Model, i)) for i in col_headers]
query = (
Model.query.with_entities(Model.m_t, *search_columns)
.group_by(Model.g)
.filter(*queries)
.paginate(page_number, page_size, False)
)