利用存储过程造测试数据

Posted wen-pan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用存储过程造测试数据相关的知识,希望对你有一定的参考价值。

开发过程中我们往往会遇到需要向数据库插入几千或几万条数据以测试某个功能,或者为了复现生产的某个bug而需要在测试环境造大量的数据的需求,此时便可以通过存储过程来直接向数据库某张表里生成指定条数的测试数据!!!

  • 以往logistics_notice表里生成指定条数的数据为例做演示!!!

1. 创建随机函数

①、生成指定长度的随机字符串的函数

  • 生成指定长度的随机字符串
  • 函数用完时记得删除:drop function rand_string;
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
BEGIN 
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
DECLARE return_str varchar(255) DEFAULT '' ;
DECLARE i INT DEFAULT 0; 
WHILE i < n DO 
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); 
SET i = i +1; 
END WHILE; 
RETURN return_str; 
END

②、生成指定长度的随机数字的函数

  • 按照入参from_numto_num,生成该区间的随机数字
DELIMITER $$
CREATE FUNCTION  rand_num (from_num INT ,to_num INT) RETURNS INT(11)
BEGIN   
DECLARE i INT DEFAULT 0;  
SET i = FLOOR(from_num +RAND()*(to_num - from_num+1))   ;
RETURN i;  
END$$ 

2.创建存储过程

  • 该存储过程中会调用上面的rand_string函数生成指定长度的随机字符串
  • 该存储过程在调用时根据传入的入参可以控制生成的数据条数
CREATE  PROCEDURE `insert_logistics_notice`(IN n int)
BEGIN  
  DECLARE i INT DEFAULT 1;
    WHILE (i <= n ) DO
      INSERT into logistics_notice(waybill_no,node_status_cd,node_dt,node_desc,tenant_code,is_valid,create_time,last_modified_time)
     values(concat('wenpan-1234-',i) ,1,now(),rand_string(5),'cathay',1,now(),now());
			set i=i+1;
    END WHILE;
end

3. 查看存储过程

show create procedure insert_logistics_notice

4. 调用存储过程

call insert_logistics_notice(100000);

5.删除存储过程

DROP PROCEDURE insert_logistics_notice;

6.问题

创建函数,假如报错:This function has none of DETERMINISTIC…

# 由于开启过慢查询日志bin-log, 我们就必须为我们的function指定一个参数。
#主从复制,主机会将写操作记录在bin-log日志中。从机读取bin-log日志,执行语句来同步数据。
#如果使用函数来操作数据,会导致从机和主键操作时间不一致。所以,默认情况下,mysql不开启创建函数设置
#查看mysql是否允许创建函数:
show variables like 'log_bin_trust_function_creators';
#命令开启:允许创建函数设置:
set global log_bin_trust_function_creators=1; 
# 不加global只是当前窗口有效。mysqld重启,上述参数又会消失。
#永久方法:
•    windows下:my.ini[mysqld]加上:log_bin_trust_function_creators=1  
•    linux下:/etc/my.cnf下my.cnf[mysqld]加上:log_bin_trust_function_creators=1

7.参考

以上是关于利用存储过程造测试数据的主要内容,如果未能解决你的问题,请参考以下文章

利用存储过程生成大量的数据(oracle,mysql)

利用Mysql存储过程造百万级数据

测试造100条数据存储过程

性能测试四十:Mysql存储过程造数据

python系列——利用Faker模块造测试数据

批量造数据,测试数据,数据生成