Python采用并发查询mysql以及调用API灌数据 (二) - PyMysql操作数据库基本类封装_Python开发

前情回顾

上一篇文章已经写好了查询数据库以及post请求API的实例,那么本章节我们来继续。

实战任务

本次因为服务架构重构,表优化、重构,带来的任务就是需要从原来的mysql数据库中,读取原表数据(部分存在多张关联查询)然后通过调用API的服务方式灌入新的数据库表中(包含mysql、mongodb)。

执行流程如下

Python采用并发查询mysql以及调用API灌数据 (二) - PyMysql操作数据库基本类封装_Python开发_02

那么根据流程所需要的功能,需要以下的实例进行支撑:
1.并发实例
2.查询数据实例
3.执行post请求实例

目标:构建实际数据场景 --> 抽象编写查询以及post的类方法 --> 编写整合处理方法

构建实际数据场景

Python采用并发查询mysql以及调用API灌数据 (二) - PyMysql操作数据库基本类封装_Python开发_03

可以看出,整个流程中对于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、前端等视频资源