|
@@ -54,7 +54,6 @@ class DBHelper:
|
|
|
self.session.rollback()
|
|
self.session.rollback()
|
|
|
logger.error(f"{operation}失败: {error}")
|
|
logger.error(f"{operation}失败: {error}")
|
|
|
|
|
|
|
|
-
|
|
|
|
|
def add(self, entity):
|
|
def add(self, entity):
|
|
|
"""插入实体对象"""
|
|
"""插入实体对象"""
|
|
|
try:
|
|
try:
|
|
@@ -72,7 +71,7 @@ class DBHelper:
|
|
|
except SQLAlchemyError as e:
|
|
except SQLAlchemyError as e:
|
|
|
self._handle_error(e, "查询")
|
|
self._handle_error(e, "查询")
|
|
|
|
|
|
|
|
- def get_all(self, model, limit=None, **filters):
|
|
|
|
|
|
|
+ def get_all(self, model, limit=None, order_by=None, **filters):
|
|
|
"""获取所有符合条件的实体对象,支持更复杂的查询条件"""
|
|
"""获取所有符合条件的实体对象,支持更复杂的查询条件"""
|
|
|
try:
|
|
try:
|
|
|
query = self.session.query(model)
|
|
query = self.session.query(model)
|
|
@@ -92,6 +91,16 @@ class DBHelper:
|
|
|
if actual_filters:
|
|
if actual_filters:
|
|
|
query = query.filter_by(**actual_filters)
|
|
query = query.filter_by(**actual_filters)
|
|
|
|
|
|
|
|
|
|
+ # 添加排序条件
|
|
|
|
|
+ if order_by:
|
|
|
|
|
+ # order_by 是一个字典,形如 {'field_name': 'asc' 或 'desc'}
|
|
|
|
|
+ for field_name, direction in order_by.items():
|
|
|
|
|
+ field = getattr(model, field_name)
|
|
|
|
|
+ if direction == 'desc':
|
|
|
|
|
+ query = query.order_by(field.desc())
|
|
|
|
|
+ else:
|
|
|
|
|
+ query = query.order_by(field.asc())
|
|
|
|
|
+
|
|
|
# 如果传入了 limit 参数,则限制返回的最大条数
|
|
# 如果传入了 limit 参数,则限制返回的最大条数
|
|
|
if limit is not None:
|
|
if limit is not None:
|
|
|
query = query.limit(limit)
|
|
query = query.limit(limit)
|
|
@@ -102,6 +111,84 @@ class DBHelper:
|
|
|
except SQLAlchemyError as e:
|
|
except SQLAlchemyError as e:
|
|
|
self._handle_error(e, "查询")
|
|
self._handle_error(e, "查询")
|
|
|
|
|
|
|
|
|
|
+ def get_paginated(self, model, page=1, page_size=10, order_by=None, **filters):
|
|
|
|
|
+ """分页查询符合条件的实体对象,支持排序"""
|
|
|
|
|
+ try:
|
|
|
|
|
+ query = self.session.query(model)
|
|
|
|
|
+
|
|
|
|
|
+ # 处理特殊条件如 __in
|
|
|
|
|
+ actual_filters = {}
|
|
|
|
|
+ for key, value in filters.items():
|
|
|
|
|
+ if key.endswith('__in'):
|
|
|
|
|
+ # 处理 IN 查询
|
|
|
|
|
+ field_name = key[:-4]
|
|
|
|
|
+ field = getattr(model, field_name)
|
|
|
|
|
+ query = query.filter(field.in_(value))
|
|
|
|
|
+ else:
|
|
|
|
|
+ actual_filters[key] = value
|
|
|
|
|
+
|
|
|
|
|
+ # 应用其他过滤条件
|
|
|
|
|
+ if actual_filters:
|
|
|
|
|
+ query = query.filter_by(**actual_filters)
|
|
|
|
|
+
|
|
|
|
|
+ # 添加排序条件
|
|
|
|
|
+ if order_by:
|
|
|
|
|
+ # order_by 是一个字典,形如 {'field_name': 'asc' 或 'desc'}
|
|
|
|
|
+ for field_name, direction in order_by.items():
|
|
|
|
|
+ field = getattr(model, field_name)
|
|
|
|
|
+ if direction == 'desc':
|
|
|
|
|
+ query = query.order_by(field.desc())
|
|
|
|
|
+ else:
|
|
|
|
|
+ query = query.order_by(field.asc())
|
|
|
|
|
+
|
|
|
|
|
+ # 计算总记录数
|
|
|
|
|
+ total_count = query.count()
|
|
|
|
|
+
|
|
|
|
|
+ # 分页查询,计算偏移量
|
|
|
|
|
+ offset = (page - 1) * page_size
|
|
|
|
|
+ query = query.offset(offset).limit(page_size)
|
|
|
|
|
+
|
|
|
|
|
+ # 执行查询
|
|
|
|
|
+ entities = query.all()
|
|
|
|
|
+
|
|
|
|
|
+ # 返回分页结果:当前页数据和总记录数
|
|
|
|
|
+ return {
|
|
|
|
|
+ "entities": entities,
|
|
|
|
|
+ "total_count": total_count,
|
|
|
|
|
+ "page": page,
|
|
|
|
|
+ "page_size": page_size,
|
|
|
|
|
+ "total_pages": (total_count + page_size - 1) // page_size # 向上取整计算总页数
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ except SQLAlchemyError as e:
|
|
|
|
|
+ self._handle_error(e, "查询")
|
|
|
|
|
+
|
|
|
|
|
+ def count(self, model, **filters):
|
|
|
|
|
+ """查询符合条件的记录条数"""
|
|
|
|
|
+ try:
|
|
|
|
|
+ query = self.session.query(model)
|
|
|
|
|
+
|
|
|
|
|
+ # 处理特殊条件如 __in
|
|
|
|
|
+ actual_filters = {}
|
|
|
|
|
+ for key, value in filters.items():
|
|
|
|
|
+ if key.endswith('__in'):
|
|
|
|
|
+ # 处理 IN 查询
|
|
|
|
|
+ field_name = key[:-4]
|
|
|
|
|
+ field = getattr(model, field_name)
|
|
|
|
|
+ query = query.filter(field.in_(value))
|
|
|
|
|
+ else:
|
|
|
|
|
+ actual_filters[key] = value
|
|
|
|
|
+
|
|
|
|
|
+ # 应用其他过滤条件
|
|
|
|
|
+ if actual_filters:
|
|
|
|
|
+ query = query.filter_by(**actual_filters)
|
|
|
|
|
+
|
|
|
|
|
+ # 执行查询并获取总记录数
|
|
|
|
|
+ count = query.count()
|
|
|
|
|
+ return count
|
|
|
|
|
+ except SQLAlchemyError as e:
|
|
|
|
|
+ self._handle_error(e, "查询条数")
|
|
|
|
|
+
|
|
|
def update(self, model, filters, updates):
|
|
def update(self, model, filters, updates):
|
|
|
"""更新实体对象"""
|
|
"""更新实体对象"""
|
|
|
try:
|
|
try:
|