-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmysql_util.py
232 lines (213 loc) · 7.43 KB
/
mysql_util.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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
"""
数据库连接工具类
# """
import pymysql
import traceback
from DBUtils.PooledDB import PooledDB
from scrapy.utils.project import get_project_settings
class MysqlUtil(object):
"""
MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现获取连接对象:conn = Mysql.getConn()
释放连接对象;conn.close()或del conn
"""
# 连接池对象
__pool = None
#配置元组
config = {}
def __init__(self):
settings = get_project_settings()
MysqlUtil.config = {
'host':settings.get('MYSQL_HOST'),
'port':settings.get('MYSQL_PORT'),
'database':settings.get('MYSQL_DATABASE'),
'user':settings.get('MYSQL_USER'),
'password':settings.get('MYSQL_PASSWORD'),
'charset':settings.get('MYSQL_CHARSET')
}
# 数据库构造函数,从连接池中取出连接,并生成操作游标
self._conn = MysqlUtil.get_conn()
self._cursor = self._conn.cursor()
# 获取链接
@staticmethod
def get_conn():
"""
@summary: 静态方法,从连接池中取出连接
@return MySQLdb.connection
"""
print(MysqlUtil.config)
if MysqlUtil.__pool is None:
__pool = PooledDB(
creator=pymysql,
mincached=1,
maxcached=20,
host=MysqlUtil.config['host'],
port=MysqlUtil.config['port'],
user=MysqlUtil.config['user'],
passwd=MysqlUtil.config['password'],
db=MysqlUtil.config['database'],
charset=MysqlUtil.config['charset']
)
return __pool.connection()
# 查询所有数据
def get_all(self, sql, param=None):
"""
@summary: 执行查询,并取出所有结果集
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param param: 可选参数,条件列表值(元组/列表)
@return: result list(字典对象)/boolean 查询到的结果集
"""
try:
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
if count > 0:
result = self._cursor.fetchall()
else:
result = False
return result
except Exception as e:
traceback.print_exc(e)
# 查询某一个数据
def get_one(self, sql, param=None):
"""
@summary: 执行查询,并取出第一条
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param param: 可选参数,条件列表值(元组/列表)
@return: result list/boolean 查询到的结果集
"""
try:
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
if count > 0:
result = self._cursor.fetchone()
else:
result = False
return result
except Exception as e:
traceback.print_exc(e)
# 查询数量
def get_count(self, sql, param=None):
"""
@summary: 执行查询,返回结果数
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param param: 可选参数,条件列表值(元组/列表)
@return: result list/boolean 查询到的结果集
"""
try:
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
return count
except Exception as e:
traceback.print_exc(e)
# 查询部分
def get_many(self, sql, num, param=None):
"""
@summary: 执行查询,并取出num条结果
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param num:取得的结果条数
@param param: 可选参数,条件列表值(元组/列表)
@return: result list/boolean 查询到的结果集
"""
try:
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
if count > 0:
result = self._cursor.fetchmany(num)
else:
result = False
return result
except Exception as e:
traceback.print_exc(e)
# 插入一条数据
def insert_one(self, sql, value):
"""
@summary: 向数据表插入一条记录
@param sql:要插入的SQL格式
@param value:要插入的记录数据tuple/list
@return: insertId 受影响的行数
"""
try:
row_count = self._cursor.execute(sql, value)
return row_count
except Exception as e:
traceback.print_exc(e)
self.end("rollback")
# 插入多条数据
def insert_many(self, sql, values):
"""
@summary: 向数据表插入多条记录
@param sql:要插入的SQL格式
@param values:要插入的记录数据tuple(tuple)/list[list]
@return: count 受影响的行数
"""
try:
row_count = self._cursor.executemany(sql, values)
return row_count
except Exception as e:
traceback.print_exc(e)
self.end("rollback")
# def __get_insert_id(self):
# """
# 获取当前连接最后一次插入操作生成的id,如果没有则为0
# """
# self._cursor.execute("SELECT @@IDENTITY AS id")
# result = self._cursor.fetchall()
# return result[0]['id']
# 执行sql
def __query(self, sql, param=None):
try:
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
return count
except Exception as e:
traceback.print_exc(e)
# 更新
def update(self, sql, param=None):
"""
@summary: 更新数据表记录
@param sql: SQL格式及条件,使用(%s,%s)
@param param: 要更新的 值 tuple/list
@return: count 受影响的行数
"""
return self.__query(sql, param)
# 删除
def delete(self, sql, param=None):
"""
@summary: 删除数据表记录
@param sql: SQL格式及条件,使用(%s,%s)
@param param: 要删除的条件 值 tuple/list
@return: count 受影响的行数
"""
return self.__query(sql, param)
def begin(self):
"""
@summary: 开启事务
"""
self._conn.autocommit(0)
def end(self, option='commit'):
"""
@summary: 结束事务
"""
if option == 'commit':
self._conn.commit()
else:
self._conn.rollback()
def dispose(self, is_end=1):
"""
@summary: 释放连接池资源
"""
if is_end == 1:
self.end('commit')
else:
self.end('rollback')
self._cursor.close()
self._conn.close()