Python采用并发查询mysql以及调用API灌数据 (一)

实战任务

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

执行流程如下

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

目标:本章节先实现 2、3两点的实例。

查询数据库实例(PyMySQL连接mysql数据库)

PyMySQL是一个纯Python写的MySQL客户端,它的目标是替代MySQLdb,可以在CPython、PyPy、IronPython和Jython环境下运行。PyMySQL在MIT许可下发布。
PyMySQL的性能和MySQLdb几乎相当,如果对性能要求
不是特别的强,使用PyMySQL将更加方便。
PyMySQL的使用方法和MySQLdb几乎一样。

安装PyMysql

pip install pymysql
Python采用并发查询mysql以及调用API灌数据 (一)_第1张图片

编写PyMysql连接mysql相关操作的实例

# -*- coding: utf-8 -*-
import pymysql

config = {
    'host': '你的mysql服务的IP地址',
    'port': 3306,
    'user': 'root',
    'passwd': '你的root密码',
    'charset':'utf8mb4',
    'cursorclass':pymysql.cursors.DictCursor
    }
conn = pymysql.connect(**config)
conn.autocommit(1)
cursor = conn.cursor()

try:
    # 创建数据库
    DB_NAME = 'test_db'
    cursor.execute('DROP DATABASE IF EXISTS %s' %DB_NAME)
    cursor.execute('CREATE DATABASE IF NOT EXISTS %s' %DB_NAME)
    conn.select_db(DB_NAME)

    #创建表
    TABLE_NAME = 'test_user'
    cursor.execute('CREATE TABLE %s(id int primary key,name varchar(30))' %TABLE_NAME)

    # 批量插入纪录
    values = []
    for i in range(20):
        values.append((i,'testuser'+str(i)))
    cursor.executemany('INSERT INTO '+ TABLE_NAME +' values(%s,%s)' ,values)

    # 查询数据条目
    count = cursor.execute('SELECT * FROM %s' %TABLE_NAME)
    print 'total records:', cursor.rowcount

    # 获取表名信息
    desc = cursor.description
    print "%s %3s" % (desc[0][0], desc[1][0])

    cursor.scroll(10,mode='absolute')
    results = cursor.fetchall()
    for result in results:
        print result

except:
    import traceback
    traceback.print_exc()
    # 发生错误时会滚
    conn.rollback()
finally:
    # 关闭游标连接
    cursor.close()
    # 关闭数据库连接
    conn.close()

执行结果:

E:\PycharmProjects\DataProject>python MysqlTest01.py
total records: 20
id name
{u'id': 10, u'name': u'testuser10'}
{u'id': 11, u'name': u'testuser11'}
{u'id': 12, u'name': u'testuser12'}
{u'id': 13, u'name': u'testuser13'}
{u'id': 14, u'name': u'testuser14'}
{u'id': 15, u'name': u'testuser15'}
{u'id': 16, u'name': u'testuser16'}
{u'id': 17, u'name': u'testuser17'}
{u'id': 18, u'name': u'testuser18'}
{u'id': 19, u'name': u'testuser19'}

E:\PycharmProjects\DataProject>

从上面的步骤中,已经可以创建数据库、创建表、插入数据以及查询数据。但是在处理插入中文的时候是存在问题的。
在创建数据库的时候,需要设置好utf的格式。

cursor.execute('CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci' %DB_NAME )

编写插入以及查询中文数据的实例

# -*- coding: utf-8 -*-
import pymysql

config = {
    'host': '你的mysql服务的IP地址',
    'port': 3306,
    'user': 'root',
    'passwd': '你的mysql服务的root密码',
    'charset':'utf8',
    'cursorclass':pymysql.cursors.DictCursor
    }
conn = pymysql.connect(**config)
conn.autocommit(1)
cursor = conn.cursor()

try:
    # 创建数据库
    DB_NAME = 'test_db'
    cursor.execute('DROP DATABASE IF EXISTS %s' %DB_NAME)
    cursor.execute('CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci' %DB_NAME )
    conn.select_db(DB_NAME)

    #创建表
    TABLE_NAME = 'test_user'
    cursor.execute('CREATE TABLE %s(id int primary key,name varchar(30))' %TABLE_NAME)

    # 批量插入纪录
    values = []
    for i in range(20):
        # values.append((i,"testuser"+str(i)))
        values.append((i,u"测试用户"+str(i))) # 插入中文数据
    cursor.executemany('INSERT INTO '+ TABLE_NAME +' values(%s,%s)' ,values)

    # 查询数据条目
    count = cursor.execute('SELECT * FROM %s' %TABLE_NAME)
    print 'total records:', cursor.rowcount

    # 获取表名信息
    # desc = cursor.description
    # print "%s %3s" % (desc[0][0], desc[1][0])

    cursor.scroll(10,mode='absolute')
    results = cursor.fetchall()
    for row in results:
        # user_id = row[0]
        print row
        print(row['id'])      # 查询打印用户id
        print(row['name'])    # 查询打印用户名


except:
    import traceback
    traceback.print_exc()
    # 发生错误时会滚
    conn.rollback()
finally:
    # 关闭游标连接
    cursor.close()
    # 关闭数据库连接
    conn.close()

执行如下:

E:\PycharmProjects\DataProject>python MysqlTest01.py
total records: 20
{u'id': 10, u'name': u'\u6d4b\u8bd5\u7528\u623710'}
10
测试用户10
{u'id': 11, u'name': u'\u6d4b\u8bd5\u7528\u623711'}
11
测试用户11
{u'id': 12, u'name': u'\u6d4b\u8bd5\u7528\u623712'}
12
测试用户12
{u'id': 13, u'name': u'\u6d4b\u8bd5\u7528\u623713'}
13
测试用户13

在本次实战中,是不需要做创建库、表、插入数据的操作的,只需要查询对应的数据,然后调用API进行post请求即可,那么下面单独写一个查询的实例。

编写PyMysql的查询实例 - 单独查询用户id以及用户名

# -*- coding: utf-8 -*-
import pymysql

config = {
    'host': '你的mysql服务的IP',
    'port': 3306,
    'user': 'root',
    'passwd': '你的mysql的root密码',
    'charset':'utf8',
    'cursorclass':pymysql.cursors.DictCursor
    }
conn = pymysql.connect(**config)
conn.autocommit(1)
cursor = conn.cursor()

try:
    # 设置使用数据库
    DB_NAME = 'test_db'
    conn.select_db(DB_NAME)

    #定义查询的表
    TABLE_NAME = 'test_user'

    # 查询数据条目
    count = cursor.execute('SELECT * FROM %s' %TABLE_NAME)
    print 'total records:', cursor.rowcount

    # 获取表名信息
    # desc = cursor.description
    # print "%s %3s" % (desc[0][0], desc[1][0])

    cursor.scroll(10,mode='absolute')
    results = cursor.fetchall()
    for row in results:
        # print row
        print("user_id=%s ,user_name=%s " % (row['id'],row['name'])) # 查询用户id\用户名


except:
    import traceback
    traceback.print_exc()
    # 发生错误时会滚
    conn.rollback()
finally:
    # 关闭游标连接
    cursor.close()
    # 关闭数据库连接
    conn.close()

执行如下:

E:\PycharmProjects\DataProject>python MysqlTest02.py
total records: 20
user_id=10 ,user_name=测试用户10
user_id=11 ,user_name=测试用户11
user_id=12 ,user_name=测试用户12
user_id=13 ,user_name=测试用户13
user_id=14 ,user_name=测试用户14
user_id=15 ,user_name=测试用户15
user_id=16 ,user_name=测试用户16
user_id=17 ,user_name=测试用户17
user_id=18 ,user_name=测试用户18
user_id=19 ,user_name=测试用户19

E:\PycharmProjects\DataProject>

写到这里基本上已经满足了查询mysql数据的需求了,那么下一步编写执行POST请求的代码实例。

编写执行POST请求API的代码实例

注意:Python中的请求体需要填写null的时候用None替换。

首先使用POSTMAN请求确认接口是否正常:


Python采用并发查询mysql以及调用API灌数据 (一)_第2张图片

按照该上图所示,接口的API服务是能够正常请求的,那么下来用python代码请求一下这个Post请求:

# coding:utf-8
import urllib2,json
url='修改你这边提供服务的API'
data=json.dumps({"userId":"21111111","province":None})                #请求体数据, 注意:python中没有null,需要用None来替换
headers={
     # 修改你这边Header的参数
    'Content-Type':'application/json'
}     #头部
request = urllib2.Request(url,data,headers)     #urllib2用一个Request对象来映射你提出的HTTP请求
print request
response = urllib2.urlopen(request)             #通过调用urlopen并传入Request对象,将返回一个相关请求response对象
print response
message = response.read()                       #这个应答对象如同一个文件对象,所以你可以在Response中调用.read()
print message

执行返回结果如下:

E:\PycharmProjects\DataProject>python PostTest02.py

>
{"resultCode":0,"message":null,"data":{"id":"1066914784882040832","userId":21111111,"userCode":null,"province":null,"city":null,"county":null,"town":null,"village":null,....},"accessory":null}

E:\PycharmProjects\DataProject>

从返回结果 "resultCode":0 可以知道,执行的请求成功了。如果是其他返回结果参数,例如"resultCode":500那么就要处理请求失败的情况。

在上面的内容中已经有了基本执行的示例,但是如果需要频繁操作,肯定需要抽象相关的方法类,下一篇章Python采用并发查询mysql以及调用API灌数据 (二) - PyMysql操作数据库基本类封装


关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

你可能感兴趣的:(Python采用并发查询mysql以及调用API灌数据 (一))