|
@@ -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()
|
|
|
-
|
|
|
-
|
|
|
-
|