Repository navigation
Expand file tree
/
Copy pathdb_utils.py
More file actions
148 lines (119 loc) · 4.28 KB
/
Copy pathdb_utils.py
File metadata and controls
148 lines (119 loc) · 4.28 KB
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
138
139
140
141
142
143
144
145
146
from flaskext.mysql import MySQL
from db import mysql
# SQL returns rows of tuples
# e.g. result = [
# (var_1, var_2, var_3,... var_N),
# (var_1, var_2, var_3,... var_N),
# ...
# (var_1, var_2, var_3,... var_N),
# ]
class DBHelper:
'''
This is similar to the methods below this class, but returns a bit more context
'''
def __init__(self, mysql: MySQL):
self.mysql = mysql
def execute(self, query, vals=None, fetch="all"):
'''
Execute SQL queries.
Args:
+query (`str`): SQL statement
+vals (`tuple` or `list` or `dict` or `None`): query parameters
+fetch (`str` or `None`):
"all" -> fetchall() -> returns a list of tuples
"one" -> fetchone() -> returns the result as a single tuple (if >1)
None -> no fetch (expected INSERT/UPDATE/DELETE)
Returns:
post -> list[dict] or dict as [{"rowcount": int, "lastrowid": int}]
get -> list[tuples] or tuple as [(ret_val1, ret_val2,...),...]
'''
conn = self.mysql.connect()
cursor = conn.cursor()
try:
if isinstance(vals, list) and all(isinstance(v, (tuple, list)) for v in vals):
cursor.executemany(query, vals)
else:
cursor.execute(query, vals or ())
if fetch == "all":
result = cursor.fetchall()
# NOTE: Unpack the result using as if it was an array
elif fetch == "one":
result = cursor.fetchone()
else:
result = {
"rowcount": cursor.rowcount,
"lastrowid": getattr(cursor, "lastrowid", None) # <- safe lookup
}
conn.commit()
return result
finally:
cursor.close()
conn.close()
def get(self, query, vals=None, fetchOne=False):
'''
For SELECT Queries
'''
return self.execute(query, vals, fetch="one" if fetchOne else "all")
def post(self, query, vals=None):
'''
For INSERT/UPDATE/DELETE queries.
Returns {rowcount=, lastrowid=,} as a dict,
where rowcount is # of rowsaffected, and
lastrowid is the PK for the most recently returned row
'''
return self.execute(query, vals, fetch=None)
def get_one_from_db(query, vals=None):
conn = mysql.connect()
cursor = conn.cursor()
cursor.execute(query, vals) if vals else cursor.execute(query)
# result = cursor.fetchone()
result = []
for row in cursor:
result.append(list(row))
conn.commit()
conn.close()
return result
def getFromDB(query, vals=None, providedConn=None, providedCursor=None):
if providedConn is None:
conn = mysql.connect()
elif providedConn:
conn = providedConn
if providedCursor is None:
cursor = conn.cursor()
elif providedCursor:
cursor = providedCursor
cursor.execute(query, vals) if vals else cursor.execute(query)
# result = cursor.fetchall()
result = []
for row in cursor:
result.append(list(row))
if providedConn is None:
conn.commit()
conn.close()
return result
def postToDB(query, vals=None, providedConn=None, providedCursor=None):
if providedConn is None:
conn = mysql.connect()
elif providedConn:
conn = providedConn
if providedCursor is None:
cursor = conn.cursor()
elif providedCursor:
cursor = providedCursor
cursor.execute(query, vals) if vals else cursor.execute(query)
if providedConn is None:
conn.commit()
conn.close()
def deleteFromDB(query, vals=None, providedConn=None, providedCursor=None):
if providedConn is None:
conn = mysql.connect()
elif providedConn:
conn = providedConn
if providedCursor is None:
cursor = conn.cursor()
elif providedCursor:
cursor = providedCursor
cursor.execute(query, vals) if vals else cursor.execute(query)
if providedConn is None:
conn.commit()
conn.close()