python3刷数据之数据库pymysql模块、多线程thread模块和线程锁、数据库连接池dbutils模块的使用及问题解决


背景

首先说明本文档是描述我作为一个测试人员在实际项目过程中碰到的一个需要对数据库批量新增大量数据的场景,在刷数据时所碰到的问题及解决方法。场景描述:需要对数据库某个表新增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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值