需求描述
根据业务需求,要对券码的发放、注销、冻结接口进行性能预测,然测试环境已有的数据远不够性能测试所需要的数据量,经开发确认,构造的数据需要在两张表中进行构造,才有效,数据构造的两个主要点:①如何将大量的数据,快速高效的插入数据库 ② 由于券码要求是唯一的,如何生成唯一的16位券码。实现代码如下.
代码实现
import pymysql,base64,uuid
#logger日志模块,方便调试
from loguru import logger
class GenerateData():
def __init__(self):
"""连接数据库"""
self.db = pymysql.connect("数据库地址","账户","密码","数据库名" )
logger.info("数据库状态: %s" %self.db.server_status)
# 使用 cursor() 方法创建一个游标对象 cursor
self.cur = self.db.cursor()
def insert_batch_data(self,sql_template,sql_data):
"""批量插入数据
sql_template:插入语句模板,类型为字符串
sql_data:插入库的数据,数据类型为一个二维数据列表
"""
try:
#executemany方法适合批量执行插入的语句,执行效率很高,几万条的数据可能就十几秒
self.cur.executemany(sql_template, sql_data) # 执行sql语句
self.db.commit() # 提交到数据库执行
logger.info("插入成功")
except BaseException as e :
logger.error(e)
logger.error(sql_template)
logger.error(sql_data[0])
self.db.rollback() # 如果发生错误则回滚
def create_coupon_code(self,header,num):
"""生成券码 实例1FKA-ABR6-6USN-EDRF
header: 券码固定头部
num: 生成券码的数量
"""
res = []
for i in range(num):
#通过uuid模块生成12位的不重复的券码,与固定头部代码拼接组合成16位代码
cashcode = base64.urlsafe_b64encode(uuid.uuid4().bytes)[:-2].decode('utf-8').upper().replace('_','').replace('-','')[:12]
code = "%s-%s-%s-%s" % (header, cashcode[0:4], cashcode[4:8], cashcode[8:13])
res.append(code)
return res
def create_cpcodes_data(self,cpcode_header,max_code_id,num):
"""构造cpcodes和cpucodes表数据"""
cpcodes_res =[]
cpucodes_res =[]
code_id = max_code_id
#调用上面的create_coupon_code方法,返回券码
coupon_codes=self.create_coupon_code(cpcode_header,num)
for code in coupon_codes:
code_id+=1
cpcodes_res.append([str(code_id), code, '18', '1', 'xxxxxx', '2021-01-28 14:34:21', '2021-01-28 14:34:21', '2021-01-28 14:34:21', '2021-02-28 14:34:21', '210222190xxxx', '1', '0', '210222190xxxx'])
cpucodes_res.append([str(code_id), '1111111', 'xxxxxxx', '', '', '', '0.00', '0.00'])
return (cpcodes_res,cpucodes_res)
if __name__ == '__main__':
#创建对象
gen_data = GenerateData()
#调用方法构造两张表数据
datas=gen_data.create_cpcodes_data('1FKA',800001,80000)
cpcodes_data=datas[0]
cpucodes_data=datas[1]
#编写插入语句模板
cpcodes_sql_template="""
INSERT INTO 表名1 (
COUPON_XXXX_ID,
COUPON_CODE,
XXXX_ID,
XXXXXX_XXXXXX,
XXXXX,
XXXXX,
XXXX,
XXXX,
XXXX,
XXXX,
XXXX,
XXXX,
XXXX
)
VALUES(%s)
""" %",".join([ '%s' ]* 13)
cpucodes_sql_template="""
INSERT INTO 表名2(
XXXX,
XXXX,
XXXX,
XXXX,
XXXX,
XXXX,
XXXX,
XXXX)
VALUES(%s)
""" %",".join([ '%s' ]* 8)
#调用插入方法,执行插入操作
gen_data.insert_batch_data(cpucodes_sql_template,cpucodes_data)
gen_data.insert_batch_data(cpcodes_sql_template,cpcodes_data)