Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在mysql中自动使用虚拟数据填充表_Python_Mysql - Fatal编程技术网

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

Python 在mysql中自动使用虚拟数据填充表,python,mysql,Python,Mysql,我有一个MySQL表,我想用一些虚拟数据填充它以测试50+ 此表有一个指向另一个表的外键,因此虚拟数据必须与该表交叉引用,但又是随机的,即不能都是相同的外键 它还有一个日期添加字段,我想用一年内的随机日期填充该字段,例如2010年的任何日期 我的表格结构是: id, customer_id, date_added, title, total_cost 其中id是主键,customer_id是外键,date_added是日期字段 这样做的最佳方式是什么?我更喜欢直接在MySQL中执行,但如果不是

我有一个MySQL表,我想用一些虚拟数据填充它以测试50+

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

它还有一个日期添加字段,我想用一年内的随机日期填充该字段,例如2010年的任何日期

我的表格结构是:

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


这样做的最佳方式是什么?我更喜欢直接在MySQL中执行,但如果不是,我的站点是在Python上运行的,所以在MySQL中执行此操作的方法就可以了。

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

在您的语句中内置了几个需求,这些需求最好用过程风格来表达。SQL是一种基于集合的语言;我认为它不适合做手头的工作

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


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

如果没有Python编写的应用程序的外部帮助,我不会在MySQL中这样做

在您的语句中内置了几个需求,这些需求最好用过程风格来表达。SQL是一种基于集合的语言;我认为它不适合做手头的工作

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


如果它只是用于测试的数据库,你可以考虑一个内存数据库,你可以填充它,修改所有你喜欢的,然后为你的下一个测试吹走。我在考虑像高超音速、德比或TimesTen这样的东西。

如果你真的想开始测试数据的设置,你应该走夹具路线。这将帮助你自己建立一个非常好的开发环境,如果你正在使用的话,可以很好地集成到你网站的框架中

您可以找到夹具模块文档的链接

如果您认为这项工作有点太多,无法让所有工作都正常进行,那么可以查看MySQLdb模块,它将帮助您将数据插入表中


链接回stackoverflow可能有点低级趣味,但有人已经回答了您提出的日期问题。你可以找到。

如果你真的想开始一些测试数据的设置,你应该走夹具路线。这将帮助你自己建立一个非常好的开发环境,如果你正在使用的话,可以很好地集成到你网站的框架中

您可以找到夹具模块文档的链接

如果您认为这项工作有点太多,无法让所有工作都正常进行,那么可以查看MySQLdb模块,它将帮助您将数据插入表中


链接回stackoverflow可能有点低级趣味,但有人已经回答了您提出的日期问题。您可以找到。

快速而肮脏的解决方案:

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;

快速而肮脏的解决方案:

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;

对于测试业务规则,我实际上更喜欢经过仔细考虑的数据,而不是随机数据。从excel->csv->db或手动创建的insert语句

每种边界条件对应一行,例如:

没有订单的顾客 一个总成本为零的客户 一位客户的名字中有外国字符,因为我总是忘记处理它 一个具有最大长度名称的客户 一位客户为了确保GUI看起来仍然很好,下了一大堆订单 这使得运行回归测试变得非常容易,因为您知道数据应该是什么样子

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

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

随机->生成随机数。 mod->用于创建重复序列1,2,3,1,2,3 lpad和rpad->用于将字符串填充到指定长度
对于测试业务规则,我实际上更喜欢经过仔细考虑的数据,而不是随机数据。从excel->csv->db或手动创建的insert语句

每种边界条件对应一行,例如:

没有订单的顾客 一个总成本为零的客户 一位客户的名字中有外国字符,因为我总是忘记处理它 一个客户 使用最大长度名称 一位客户为了确保GUI看起来仍然很好,下了一大堆订单 这使得运行回归测试变得非常容易,因为您知道数据应该是什么样子

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

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

随机->生成随机数。 mod->用于创建重复序列1,2,3,1,2,3 lpad和rpad->用于将字符串填充到指定长度
同样地,这个问题已经得到了回答,但我假设您仍然需要知道这个问题,它从MySQL运行,并根据数据类型自动填充虚拟数据

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

调用“sakila”、“film”、“1000”、“N”


您可能还想继续更新。

因此,这个问题已经很老了,已经得到了回答,但我假设您仍然需要知道这个问题,它从MySQL运行,并根据数据类型自动填充虚拟数据

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

调用“sakila”、“film”、“1000”、“N”

您可能还需要继续更新