luojunhui 4 месяцев назад
Родитель
Сommit
f1445d2561

+ 45 - 28
applications/db/__init__.py

@@ -4,7 +4,8 @@
 
 import pymysql
 from contextlib import contextmanager
-from .exceptions import QueryError, TransactionError
+
+from applications.exception import QueryError, TransactionError
 
 
 class DatabaseConnector:
@@ -47,31 +48,52 @@ class DatabaseConnector:
             self.connection.close()
             self.connection = None
 
-    def execute_query(self, query, params=None):
+    def fetch(self, query, cursor_type=None):
         """
         执行单条查询语句,并返回结果。
-
-        :param query: SQL 查询语句。
-        :param params: 可选的参数,用于参数化查询。
-        :return: 查询结果列表。
+        :param cursor_type: 输出的返回格式
+        :param query: 查询语句
+        :return: 查询结果列表
         :raises QueryError: 如果执行查询时出错。
         """
         if not self.connection:
             self.connect()
 
         try:
-            with self.connection.cursor() as cursor:
-                cursor.execute(query, params)
+            with self.connection.cursor(cursor_type) as cursor:
+                cursor.execute(query)
                 result = cursor.fetchall()
                 return result
         except pymysql.MySQLError as e:
-            self.connection.rollback()
-            raise QueryError(f"查询执行失败: {e}")
+            self.rollback()
+            raise QueryError(e, query)
 
-    def execute_many(self, query, params_list):
+    def save(self, query, params):
         """
-        执行多条查询语句。
+        执行单条插入、更新语句
+        :param query:
+        :param params:
+        :return:
+        """
+        if not self.connection:
+            self.connect()
 
+        try:
+            with self.connection.cursor() as cursor:
+                affected_rows = cursor.execute(query, params)
+                if affected_rows:
+                    self.commit()
+                    return affected_rows
+                else:
+                    self.rollback()
+                    return 0
+        except pymysql.MySQLError as e:
+            self.rollback()
+            raise QueryError(e, query)
+
+    def save_many(self, query, params_list):
+        """
+        执行多条查询语句
         :param query: SQL 查询语句。
         :param params_list: 包含多个参数的列表。
         :raises QueryError: 如果执行查询时出错。
@@ -81,10 +103,16 @@ class DatabaseConnector:
 
         try:
             with self.connection.cursor() as cursor:
-                cursor.executemany(query, params_list)
+                affected_rows = cursor.executemany(query, params_list)
+                if affected_rows:
+                    self.commit()
+                    return affected_rows
+                else:
+                    self.rollback()
+                    return 0
         except pymysql.MySQLError as e:
-            self.connection.rollback()
-            raise QueryError(f"批量查询执行失败: {e}")
+            self.rollback()
+            raise QueryError(e, query)
 
     def commit(self):
         """
@@ -96,7 +124,6 @@ class DatabaseConnector:
             raise TransactionError("没有活动的数据库连接。")
         try:
             self.connection.commit()
-            print("事务提交成功。")
         except pymysql.MySQLError as e:
             self.connection.rollback()
             raise TransactionError(f"提交事务失败: {e}")
@@ -111,23 +138,16 @@ class DatabaseConnector:
             raise TransactionError("没有活动的数据库连接。")
         try:
             self.connection.rollback()
-            print("事务已回滚。")
         except pymysql.MySQLError as e:
             raise TransactionError(f"回滚事务失败: {e}")
 
     @contextmanager
     def transaction(self):
         """
-        上下文管理器,用于处理事务。
-
-        使用示例:
-            with db.transaction():
-                db.execute_query("INSERT INTO ...")
-                db.execute_query("UPDATE ...")
+        上下文管理器,用于处理事务
         """
         try:
-            yield
-            self.commit()
+            yield self.commit()
         except Exception as e:
             self.rollback()
             raise e
@@ -146,6 +166,3 @@ class DatabaseConnector:
         if exc_type:
             self.rollback()
         self.close()
-
-
-

+ 0 - 18
applications/db/exceptions.py

@@ -1,18 +0,0 @@
-"""
-@author: luojunhui
-"""
-
-
-class DatabaseError(Exception):
-    """应用程序数据库基础异常"""
-    pass
-
-
-class QueryError(DatabaseError):
-    """数据库查询异常"""
-    pass
-
-
-class TransactionError(DatabaseError):
-    """事务处理异常"""
-    pass

+ 5 - 0
applications/exception/__init__.py

@@ -0,0 +1,5 @@
+"""
+@author: luojunhui
+"""
+from .query_error import QueryError
+from .transaction_error import TransactionError

+ 27 - 0
applications/exception/query_error.py

@@ -0,0 +1,27 @@
+"""
+@author: luojunhui
+"""
+import json
+
+from applications import log
+
+
+class QueryError(Exception):
+    """数据库查询异常"""
+
+    def __init__(self, error=None, sql=None):
+        """
+        :param error: 异常对象,可选,用于提供更详细的错误信息。
+        :param sql: 出错的 SQL 语句,可选,用于调试和记录日志。
+        """
+        error_obj = {
+            "error": str(error),
+            "sql": sql,
+            "message": "sql语法错误"
+        }
+        log(
+            task="sql_query",
+            function="log_query_error",
+            data=error_obj
+        )
+        super().__init__(json.dumps(error_obj, ensure_ascii=False, indent=4))

+ 21 - 0
applications/exception/transaction_error.py

@@ -0,0 +1,21 @@
+"""
+@author: luojunhui
+事务异常
+"""
+
+from applications import log
+
+
+class TransactionError(Exception):
+    """事务处理失败"""
+
+    def __init__(self, message):
+        """
+        :param message: 异常消息
+        """
+        log(
+            task="transaction",
+            function="log_query_error",
+            message=message
+        )
+        super().__init__(message)