前情回顾
上一篇文章已经写好了查询数据库以及post请求API的实例,那么本章节我们来继续。
实战任务
本次因为服务架构重构,表优化、重构,带来的任务就是需要从原来的mysql数据库中,读取原表数据(部分存在多张关联查询)然后通过调用API的服务方式灌入新的数据库表中(包含mysql、mongodb)。
执行流程如下
那么根据流程所需要的功能,需要以下的实例进行支撑:
1.并发实例
2.查询数据实例
3.执行post请求实例
目标:构建实际数据场景 --> 抽象编写查询以及post的类方法 --> 编写整合处理方法
构建实际数据场景
可以看出,整个流程中对于mysql的操作是很重要的,为了方便行事。下面我对PyMysql操作数据库的基本类进行了封装处理。
编写数据库查询的工具类方法
实现代码如下:
1# -*- coding: utf-8 -*-
2import pymysql
3import re
4
5class MysqldbHelper(object): # 继承object类所有方法
6
7 '''
8 构造方法:
9 config = {
10 'host': '127.0.0.1',
11 'port': 3306,
12 'user': 'root',
13 'passwd': 'root',
14 'charset':'utf8',
15 'cursorclass':pymysql.cursors.DictCursor
16 }
17 conn = pymysql.connect(**config)
18 conn.autocommit(1)
19 cursor = conn.cursor()
20 '''
21 def __init__(self , config):
22
23 self.host = config['host']
24 self.username = config['user']
25 self.password = config['passwd']
26 self.port = config['port']
27 self.con = None
28 self.cur = None
29
30 try:
31 self.con = pymysql.connect(**config)
32 self.con.autocommit(1)
33 # 所有的查询,都在连接 con 的一个模块 cursor 上面运行的
34 self.cur = self.con.cursor()
35 except:
36 print "DataBase connect error,please check the db config."
37
38 # 关闭数据库连接
39 def close(self):
40 if not self.con:
41 self.con.close()
42 else:
43 print "DataBase doesn't connect,close connectiong error;please check the db config."
44
45 # 创建数据库
46 def createDataBase(self,DB_NAME):
47 # 创建数据库
48 self.cur.execute('CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci' % DB_NAME)
49 self.con.select_db(DB_NAME)
50 print 'creatDatabase:' + DB_NAME
51
52 # 选择数据库
53 def selectDataBase(self,DB_NAME):
54 self.con.select_db(DB_NAME)
55
56 # 获取数据库版本号
57 def getVersion(self):
58 self.cur.execute("SELECT VERSION()")
59 return self.getOneData()
60
61 # 获取上个查询的结果
62 def getOneData(self):
63 # 取得上个查询的结果,是单个结果
64 data = self.cur.fetchone()
65 return data
66
67 # 创建数据库表
68 def creatTable(self, tablename, attrdict, constraint):
69 """创建数据库表
70
71 args:
72 tablename :表名字
73 attrdict :属性键值对,{'book_name':'varchar(200) NOT NULL'...}
74 constraint :主外键约束,PRIMARY KEY(`id`)
75 """
76 if self.isExistTable(tablename):
77 print "%s is exit" % tablename
78 return
79 sql = ''
80 sql_mid = '`id` bigint(11) NOT NULL AUTO_INCREMENT,'
81 for attr,value in attrdict.items():
82 sql_mid = sql_mid + '`'+attr + '`'+' '+ value+','
83 sql = sql + 'CREATE TABLE IF NOT EXISTS %s ('%tablename
84 sql = sql + sql_mid
85 sql = sql + constraint
86 sql = sql + ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
87 print 'creatTable:'+sql
88 self.executeCommit(sql)
89
90 def executeSql(self,sql=''):
91 """执行sql语句,针对读操作返回结果集
92
93 args:
94 sql :sql语句
95 """
96 try:
97 self.cur.execute(sql)
98 records = self.cur.fetchall()
99 return records
100 except pymysql.Error,e:
101 error = 'MySQL execute failed! ERROR (%s): %s' %(e.args[0],e.args[1])
102 print error
103
104 def executeCommit(self,sql=''):
105 """执行数据库sql语句,针对更新,删除,事务等操作失败时回滚
106
107 """
108 try:
109 self.cur.execute(sql)
110 self.con.commit()
111 except pymysql.Error, e:
112 self.con.rollback()
113 error = 'MySQL execute failed! ERROR (%s): %s' %(e.args[0],e.args[1])
114 print "error:", error
115 return error
116
117 def insert(self, tablename, params):
118 """创建数据库表
119
120 args:
121 tablename :表名字
122 key :属性键
123 value :属性值
124 """
125 key = []
126 value = []
127 for tmpkey, tmpvalue in params.items():
128 key.append(tmpkey)
129 if isinstance(tmpvalue, str):
130 value.append("\'" + tmpvalue + "\'")
131 else:
132 value.append(tmpvalue)
133 attrs_sql = '('+','.join(key)+')'
134 values_sql = ' values('+','.join(value)+')'
135 sql = 'insert into %s'%tablename
136 sql = sql + attrs_sql + values_sql
137 print '_insert:'+sql
138 self.executeCommit(sql)
139
140 def select(self, tablename, cond_dict='', order='', fields='*'):
141 """查询数据
142
143 args:
144 tablename :表名字
145 cond_dict :查询条件
146 order :排序条件
147
148 example:
149 print mydb.select(table)
150 print mydb.select(table, fields=["name"])
151 print mydb.select(table, fields=["name", "age"])
152 print mydb.select(table, fields=["age", "name"])
153 """
154 consql = ' '
155 if cond_dict!='':
156 for k, v in cond_dict.items():
157 consql = consql+'`'+k +'`'+ '=' + '"'+v + '"' + ' and'
158 consql = consql + ' 1=1 '
159 if fields == "*":
160 sql = 'select * from %s where ' % tablename
161 else:
162 if isinstance(fields, list):
163 fields = ",".join(fields)
164 sql = 'select %s from %s where ' % (fields, tablename)
165 else:
166 print "fields input error, please input list fields."
167 sql = sql + consql + order
168 print 'select:' + sql
169 return self.executeSql(sql)
170
171 def insertMany(self,table, attrs, values):
172 """插入多条数据
173
174 args:
175 tablename :表名字
176 attrs :属性键
177 values :属性值
178
179 example:
180 table='test_mysqldb'
181 key = ["id" ,"name", "age"]
182 value = [[101, "liuqiao", "25"], [102,"liuqiao1", "26"], [103 ,"liuqiao2", "27"], [104 ,"liuqiao3", "28"]]
183 mydb.insertMany(table, key, value)
184 """
185 values_sql = ['%s' for v in attrs]
186 attrs_sql = '('+','.join(attrs)+')'
187 values_sql = ' values('+','.join(values_sql)+')'
188 sql = 'insert into %s'% table
189 sql = sql + attrs_sql + values_sql
190 print 'insertMany:'+sql
191 try:
192 print sql
193 for i in range(0,len(values),20000):
194 self.cur.executemany(sql,values[i:i+20000])
195 self.con.commit()
196 except pymysql.Error,e:
197 self.con.rollback()
198 error = 'insertMany executemany failed! ERROR (%s): %s' %(e.args[0],e.args[1])
199 print error
200
201 def delete(self, tablename, cond_dict):
202 """删除数据
203
204 args:
205 tablename :表名字
206 cond_dict :删除条件字典
207
208 example:
209 params = {"name" : "caixinglong", "age" : "38"}
210 mydb.delete(table, params)
211
212 """
213 consql = ' '
214 if cond_dict!='':
215 for k, v in cond_dict.items():
216 if isinstance(v, str):
217 v = "\'" + v + "\'"
218 consql = consql + tablename + "." + k + '=' + v + ' and '
219 consql = consql + ' 1=1 '
220 sql = "DELETE FROM %s where%s" % (tablename, consql)
221 print sql
222 return self.executeCommit(sql)
223
224 def update(self, tablename, attrs_dict, cond_dict):
225 """更新数据
226
227 args:
228 tablename :表名字
229 attrs_dict :更新属性键值对字典
230 cond_dict :更新条件字典
231
232 example:
233 params = {"name" : "caixinglong", "age" : "38"}
234 cond_dict = {"name" : "liuqiao", "age" : "18"}
235 mydb.update(table, params, cond_dict)
236
237 """
238 attrs_list = []
239 consql = ' '
240 for tmpkey, tmpvalue in attrs_dict.items():
241 attrs_list.append("`" + tmpkey + "`" + "=" +"\'" + tmpvalue + "\'")
242 attrs_sql = ",".join(attrs_list)
243 print "attrs_sql:", attrs_sql
244 if cond_dict!='':
245 for k, v in cond_dict.items():
246 if isinstance(v, str):
247 v = "\'" + v + "\'"
248 consql = consql + "`" + tablename +"`." + "`" + k + "`" + '=' + v + ' and '
249 consql = consql + ' 1=1 '
250 sql = "UPDATE %s SET %s where%s" % (tablename, attrs_sql, consql)
251 print sql
252 return self.executeCommit(sql)
253
254 def dropTable(self, tablename):
255 """删除数据库表
256
257 args:
258 tablename :表名字
259 """
260 sql = "DROP TABLE %s" % tablename
261 self.executeCommit(sql)
262
263 def deleteTable(self, tablename):
264 """清空数据库表
265
266 args:
267 tablename :表名字
268 """
269 sql = "DELETE FROM %s" % tablename
270 print "sql=",sql
271 self.executeCommit(sql)
272
273 def isExistTable(self, tablename):
274 """判断数据表是否存在
275
276 args:
277 tablename :表名字
278
279 Return:
280 存在返回True,不存在返回False
281 """
282 sql = "select * from %s" % tablename
283 result = self.executeCommit(sql)
284 if result is None:
285 return True
286 else:
287 if re.search("doesn't exist", result):
288 return False
289 else:
290 return True
291
292if __name__ == "__main__":
293
294 # 定义数据库访问参数
295 config = {
296 'host': '你的mysql服务器IP地址',
297 'port': 3361,
298 'user': 'root',
299 'passwd': '你的mysql服务器root密码',
300 'charset': 'utf8',
301 'cursorclass': pymysql.cursors.DictCursor
302 }
303
304 # 初始化打开数据库连接
305 mydb = MysqldbHelper(config)
306
307 # 打印数据库版本
308 print mydb.getVersion()
309
310 # 创建数据库
311 DB_NAME = 'test_db'
312 # mydb.createDataBase(DB_NAME)
313
314 # 选择数据库
315 print "========= 选择数据库%s ===========" % DB_NAME
316 mydb.selectDataBase(DB_NAME)
317
318 #创建表
319 TABLE_NAME = 'test_user'
320 print "========= 选择数据表%s ===========" % TABLE_NAME
321 # CREATE TABLE %s(id int(11) primary key,name varchar(30))' %TABLE_NAME
322 attrdict = {'name':'varchar(30) NOT NULL'}
323 constraint = "PRIMARY KEY(`id`)"
324 mydb.creatTable(TABLE_NAME,attrdict,constraint)
325
326 # 插入纪录
327 print "========= 单条数据插入 ==========="
328 params = {}
329 for i in range(5):
330 params.update({"name":"testuser"+str(i)}) # 生成字典数据,循环插入
331 print params
332 mydb.insert(TABLE_NAME, params)
333 print
334
335 # 批量插入数据
336 print "========= 多条数据同时插入 ==========="
337 insert_values = []
338 for i in range(5):
339 # values.append((i,"testuser"+str(i)))
340 insert_values.append([u"测试用户"+str(i)]) # 插入中文数据
341 print insert_values
342 insert_attrs = ["name"]
343 mydb.insertMany(TABLE_NAME,insert_attrs, insert_values)
344
345 # 数据查询
346 print "========= 数据查询 ==========="
347 print mydb.select(TABLE_NAME, fields=["id", "name"])
348 print mydb.select(TABLE_NAME, cond_dict = {'name':'测试用户2'},fields=["id", "name"])
349 print mydb.select(TABLE_NAME, cond_dict = {'name':'测试用户2'},fields=["id", "name"],order="order by id desc")
350
351 # 删除数据
352 print "========= 删除数据 ==========="
353 delete_params = {"name": "测试用户2"}
354 mydb.delete(TABLE_NAME, delete_params)
355
356 # 更新数据
357 print "========= 更新数据 ==========="
358 update_params = {"name": "测试用户99"} # 需要更新为什么值
359 update_cond_dict = {"name": "测试用户3"} # 更新执行的查询条件
360 mydb.update(TABLE_NAME, update_params, update_cond_dict)
361
362 # 删除表数据
363 print "========= 删除表数据 ==========="
364 mydb.deleteTable(TABLE_NAME)
365
366 # 删除表
367 print "========= 删除表 ==========="
368 mydb.dropTable(TABLE_NAME)
测试执行结果如下:
1D:\Python27\python.exe E:/PycharmProjects/DataProject/tools/MysqlTools.py
2{u'VERSION()': u'5.7.9-log'}
3========= 选择数据库test_db ===========
4========= 选择数据表test_user ===========
5test_user is exit
6========= 单条数据插入 ===========
7{'name': 'testuser0'}
8_insert:insert into test_user(name) values('testuser0')
9
10{'name': 'testuser1'}
11_insert:insert into test_user(name) values('testuser1')
12
13{'name': 'testuser2'}
14_insert:insert into test_user(name) values('testuser2')
15
16{'name': 'testuser3'}
17_insert:insert into test_user(name) values('testuser3')
18
19{'name': 'testuser4'}
20_insert:insert into test_user(name) values('testuser4')
21
22========= 多条数据同时插入 ===========
23[[u'\u6d4b\u8bd5\u7528\u62370'], [u'\u6d4b\u8bd5\u7528\u62371'], [u'\u6d4b\u8bd5\u7528\u62372'], [u'\u6d4b\u8bd5\u7528\u62373'], [u'\u6d4b\u8bd5\u7528\u62374']]
24insertMany:insert into test_user(name) values(%s)
25insert into test_user(name) values(%s)
26========= 数据查询 ===========
27select:select id,name from test_user where 1=1
28[{u'id': 361, u'name': u'testuser0'}, {u'id': 362, u'name': u'testuser1'}, {u'id': 363, u'name': u'testuser2'}, {u'id': 364, u'name': u'testuser3'}, {u'id': 365, u'name': u'testuser4'}, {u'id': 366, u'name': u'\u6d4b\u8bd5\u7528\u62370'}, {u'id': 367, u'name': u'\u6d4b\u8bd5\u7528\u62371'}, {u'id': 368, u'name': u'\u6d4b\u8bd5\u7528\u62372'}, {u'id': 369, u'name': u'\u6d4b\u8bd5\u7528\u62373'}, {u'id': 370, u'name': u'\u6d4b\u8bd5\u7528\u62374'}]
29select:select id,name from test_user where `name`="测试用户2" and 1=1
30[{u'id': 368, u'name': u'\u6d4b\u8bd5\u7528\u62372'}]
31select:select id,name from test_user where `name`="测试用户2" and 1=1 order by id desc
32[{u'id': 368, u'name': u'\u6d4b\u8bd5\u7528\u62372'}]
33========= 删除数据 ===========
34DELETE FROM test_user where test_user.name='测试用户2' and 1=1
35========= 更新数据 ===========
36attrs_sql: `name`='测试用户99'
37UPDATE test_user SET `name`='测试用户99' where `test_user`.`name`='测试用户3' and 1=1
38========= 删除表数据 ===========
39sql= DELETE FROM test_user
40========= 删除表 ===========
41
42Process finished with exit code 0
好了,写完了基本操作类之后该怎么引用呢?
我们下一章节再见。
关注公众号回复【资料】即可获得python、php、java、前端等视频资源