在mysql中使用虚拟数据自动填充表

时间:2011-01-21 12:46:12

标签: python mysql

我有一个MySQL表,我想填充一些虚拟数据进行测试(50 +)。

此表具有另一个表的外键,因此虚拟数据必须从该表交叉引用,但同样是随机的,即不能都是相同的外键。

它还有一个添加日期的字段,我希望在一年内填充一个随机日期,例如2010年的任何一个日期。

我的表结构是:

id, customer_id, date_added, title, total_cost

其中id是主键,customer_id是外键,date_added是日期字段。

这样做的最佳方式是什么?我更喜欢直接在MySQL中进行,但如果不是我的网站在Python上运行,那么就可以这样做。

5 个答案:

答案 0 :(得分:2)

如果没有使用Python编写的应用程序的外部帮助,我不会在MySQL中执行此操作。

语句中内置了几个以程序样式表达的要求。 SQL是一种基于集合的语言;我认为它不适合手头的任务。

您希望应用程序从源中获取数据,执行您需要的任何随机化和PII删除,然后根据您的要求构建测试数据。

如果它的数据库仅用于测试,您可以考虑一个内存数据库,您可以填充,修改您喜欢的所有数据,然后吹走您的下一个测试。我正在考虑像Hypersonic或Derby或TimesTen这样的东西。

答案 1 :(得分:2)

快速而肮脏的解决方案:

drop table if exists orders;
drop table if exists customers;

create table customers
(
cust_id int unsigned not null auto_increment primary key,
name varchar(255) not null
)
engine=innodb;

create table orders
(
order_id int unsigned not null auto_increment primary key,
cust_id int unsigned not null,
order_date datetime not null,
foreign key (cust_id) references customers(cust_id) on delete cascade
)
engine=innodb;


drop procedure if exists load_test_data;

delimiter #

create procedure load_test_data()
begin

declare v_max_customers int unsigned default 0;
declare v_max_orders int unsigned default 0 ;
declare v_counter int unsigned default 0 ;
declare v_rnd_cust_id int unsigned default 0;
declare v_base_date datetime;

  set foreign_key_checks = 0;

  truncate table orders;
  truncate table customers;

  set foreign_key_checks = 1;

  set v_base_date = "2010-01-01 00:00:00";

  set v_max_customers = 1000;
  set v_max_orders = 10000; 

  start transaction;

  set v_counter = 0;
  while v_counter < v_max_customers do
        insert into customers (name) values (concat('Customer ', v_counter+1));
    set v_counter=v_counter+1;
  end while;

  commit;

  start transaction;

  set v_counter = 0;
  while v_counter < v_max_orders do

    set v_rnd_cust_id = floor(1 + (rand() * v_max_customers));

        insert into orders (cust_id, order_date) values (v_rnd_cust_id, v_base_date + interval v_counter hour);
    set v_counter=v_counter+1;
  end while;

  commit;

end #

delimiter ;

call load_test_data();

select * from customers order by cust_id desc limit 10;
select * from orders order by order_id desc limit 10;

答案 2 :(得分:1)

为了测试业务规则,我实际上更喜欢仔细考虑随机数据上的数据。可以从excel-> csv-> db或手动创建的插入语句。

每个边界条件一行,例如:

  • 没有订单的客户
  • 总成本为零的一位客户
  • 一位姓名中有外国字符的客户(因为我总是忘记处理它)
  • 一位姓名最长的客户
  • 一个客户有大量订单(以确保GUI看起来还不错)

这使得运行回归测试非常容易,因为您“知道”数据应该是什么样的。

对于性能测试,只要数据分布是真实的(这会影响索引的有用性),您就可以很好地处理随机数据。如果您有非常高级的要求,最好的办法是使用为此目的而构建的软件。

但是,您通常可以从一个整数表中生成所需的所有数据,并巧妙地使用内置函数:

  • rand() - &gt;生成随机数。
  • mod() - &gt;用于创建重复序列(1,2,3,1,2,3)
  • lpad() and rpad() - &gt;用于将字符串填充到指定长度

答案 3 :(得分:0)

如果你真的想要设置一些测试数据,你应该去固定路线。这将有助于为自己设置一个非常好的开发环境,并且如果您正在使用它,可以很好地集成到您的网站框架中。

您可以找到夹具模块here

文档的链接

如果您认为完成所有工作有点太多工作,请查看MySQLdb模块,它将帮助您将数据插入表中。

链接回stackoverflow可能很不好,但有人已经回答了你问的日期问题。你可以找到here

答案 4 :(得分:0)

因此这个问题很老并且已经回答了,但我认为你仍然需要知道从MySQL运行的这个stored procedure to load dummy data to MySQL并根据数据类型自动填充虚拟数据。

您只需指定要填充的数据库名称,表名和记录数。

<强> call populate('sakila','film',1000,'N');

(您可能还需要关注Git-Repo以获取更新。)