-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdatabase.py
137 lines (117 loc) · 4.1 KB
/
database.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
"""
Database Manager Module
===================
This module provides the DatabaseManager class that handles all database operations.
It encapsulates database connection and query execution while maintaining compatibility
with existing codebase functionality.
"""
import mysql.connector
from typing import Optional, Union, Tuple, List, Any
from base_manager import BaseManager
from config import DATABASE, HOST, PASSWORD, USER
class DatabaseManager(BaseManager):
"""
Manages database operations including connections and query execution.
Designed to be compatible with existing database usage patterns.
"""
@classmethod
def get_connection(cls, database: str = DATABASE) -> Tuple[mysql.connector.MySQLConnection, mysql.connector.cursor.MySQLCursor]:
"""
Creates and returns a database connection with standard configuration.
Direct replacement for get_db_connection.
Args:
database: Database name to connect to
Returns:
tuple: (connection, cursor)
"""
connection = mysql.connector.connect(
host=HOST,
user=USER,
password=PASSWORD,
database=database,
charset='utf8mb4',
collation='utf8mb4_unicode_ci'
)
cursor = connection.cursor(buffered=True, dictionary=True)
return connection, cursor
@classmethod
def execute_query(
cls,
query: str,
values: Optional[tuple] = None,
database: str = DATABASE,
fetch_all: bool = False
) -> Optional[Union[Tuple, List[Tuple]]]:
"""
Executes a database query. For SELECT queries returns results, otherwise returns None.
Direct replacement for use_database.
Args:
query: SQL query to execute
values: Query parameter values
database: Target database name
fetch_all: Whether to return all results for SELECT queries
Returns:
tuple: First row for SELECT queries when fetch_all=False
list[tuple]: All rows for SELECT queries when fetch_all=True
None: For non-SELECT queries
Raises:
Exception: If database error occurs
"""
connection = None
cursor = None
try:
connection, cursor = cls.get_connection(database)
if values:
cursor.execute(query, values)
else:
cursor.execute(query)
if query.strip().upper().startswith('SELECT'):
if fetch_all:
result = cursor.fetchall()
else:
result = cursor.fetchone()
return result
connection.commit()
return None
except Exception as e:
if connection:
connection.rollback()
print(f"Database error: {e}")
raise
finally:
if cursor:
cursor.close()
if connection:
connection.close()
@classmethod
def execute_many(
cls,
query: str,
values: List[tuple],
database: str = DATABASE
) -> None:
"""
Executes a query with multiple sets of values.
Args:
query: SQL query to execute
values: List of value tuples
database: Target database name
Raises:
Exception: If database error occurs
"""
connection = None
cursor = None
try:
connection, cursor = cls.get_connection(database)
cursor.executemany(query, values)
connection.commit()
except Exception as e:
if connection:
connection.rollback()
print(f"Database error: {e}")
raise
finally:
if cursor:
cursor.close()
if connection:
connection.close()