背景
首先说明本文档是描述我作为一个测试人员在实际项目过程中碰到的一个需要对数据库批量新增大量数据的场景,在刷数据时所碰到的问题及解决方法。场景描述:需要对数据库某个表新增300W条数据用来给系统计算耗时及是否会有异常。不执行不知道,一执行吓一跳,300W条数据估算需要10小时,太慢了。所以开始看能否使用多线程,然后在使用多线程的时候碰到了一些问题,下面来说如何解决的。本文涉及到的模块有pymysql模块、多线程thread模块、连接池dbutils模块。
一、pymysql模块
测试脚本如下
import pymysql
class TEST_DB(ENV):
def runsql(self,id):
conn = pymysql.connect(
host=self.swmconn['host'],
port=self.swmconn['port'],
user=self.swmconn['user'],
passwd=self.swmconn['passwd'],
db=self.swmconn['db'],
charset=self.swmconn['charset']
)
cursor = conn.cursor()
cursor.execute("INSERT INTO test(test_id) VALUES('%s')"%(id))
conn.commit()
cursor.close()
conn.close()
def run1(self,id,step):
for num in range(0,step):
fullid=id+num
TEST_DB().runsql(str(fullid))
if __name__=='__main__':
TEST_DB().run1(1000,3000000)
这是最初使用的刷数据脚本:
1、runsql方法就是一个简单的pymysql中connect实例(包括数据库的连接信息、创建游标、执行、关闭等,这边不再详细叙述),执行insert语句的;
2、run1方法传入不同id反复调用runsql方法执行刷数据,我所需要的300W条数据估算下来需要10个多小时,奔溃。
二、多线程threading模块
上面单线程实在太慢,于是百度寻找多线程方法,结果就是使用threading模块,使用方法如下。
import threading
class TEST_DB(ENV):
def runsql(self,id):
conn = pymysql.connect(
host=self.swmconn['host'],
port=self.swmconn['port'],
user=self.swmconn['user'],
passwd=self.swmconn['passwd'],
db=self.swmconn['db'],
charset=self.swmconn['charset']
)
cursor = conn.cursor()
cursor.execute("INSERT INTO test(test_id) VALUES('%s')"%(id))
conn.commit()
cursor.close()
conn.close()
def run1(self,id,step):
for num in range(0,step):
fullid=id+num
TEST_DB().runsql(str(fullid))
def run2(self,id,step):
for num in rang