flaskappbuilder把数据查询封装成了接口,避免出现重复代码。对于数据的处理使用统一的接口,有特殊的数据处理的时候新增一个接口就可以了。如果要数据查询的方式发生了变化,我们只需要修改接口就可以,不用去修改每一个需要数据查询的类。
class SQLAInterface(BaseInterface):
"""
SQLAModel
Implements SQLA support methods for views
"""
session = None
filter_converter_class = filters.SQLAFilterConverter
def __init__(self, obj, session=None):
_include_filters(self)
self.list_columns = dict()
self.list_properties = dict()
self.session = session
# Collect all SQLA columns and properties
for prop in sa.orm.class_mapper(obj).iterate_properties:
if type(prop) != SynonymProperty:
self.list_properties[prop.key] = prop
for col_name in obj.__mapper__.columns.keys():
if col_name in self.list_properties:
self.list_columns[col_name] = obj.__mapper__.columns[col_name]
super(SQLAInterface, self).__init__(obj)
def query(self, filters=None, order_column='', order_direction='',
page=None, page_size=None):
"""
QUERY
:param filters:
dict with filters {<col_name>:<value,...}
:param order_column:
name of the column to order
:param order_direction:
the direction to order <'asc'|'desc'>
:param page:
the current page
:param page_size:
the current page size
"""
query = self.session.query(self.obj)
if len(order_column.split('.')) >= 2:
tmp_order_column = ''
for join_relation in order_column.split('.')[:-1]:
model_relation = self.get_related_model(join_relation)
query = query.join(model_relation)
# redefine order column name, because relationship can have a different name
# from the related table name.
tmp_order_column = tmp_order_column + model_relation.__tablename__ + '.'
order_column = tmp_order_column + order_column.split('.')[-1]
query_count = self.session.query(func.count('*')).select_from(self.obj)
query_count = self._get_base_query(query=query_count,
filters=filters)
query = self._get_base_query(query=query,
filters=filters,
order_column=order_column,
order_direction=order_direction)
count = query_count.scalar()
if page:
query = query.offset(page * page_size)
if page_size:
query = query.limit(page_size)
return count, query.all()