Code Monkey home page Code Monkey logo

data-handygen-mysql's Introduction

NAME

Data::HandyGen::mysql - Generates test data for mysql easily.

VERSION

This documentation refers to Data::HandyGen::mysql version 0.0.5

SYNOPSIS

use DBI;
use Data::HandyGen::mysql;

my $dbh = DBI->connect('dbi:mysql:test', 'user', 'pass');

my $hd = Data::HandyGen::mysql->new( fk => 1 );
$hd->dbh($dbh);


#  -- table definitions --
#
#  create table category (
#      id           integer primary key,
#      name         varchar(20) not null
#  );
#
#  create table item (
#      id           integer primary key auto_increment,
#      category_id  interger not null,
#      name         varchar(20) not null,
#      price        integer not null,
#      constraint foreign key (category_id) references category(id)
#  );


#  1.
#  Insert one row to 'item'.
#  'category_id', 'name' and 'price' will be random values.
#  category_id refers to category.id, so the value will be selected one of values in category.id.
#  If table 'category' has no record, new record will be added to 'category'.

my $id = $hd->insert('item');

#  Result example:
#  [item]
#           id: 1
#  category_id: 497364651
#         name: name_1
#        price: 597348646
#
#  [category]
#           id: 497364651
#         name: name_497364651
#

print "ID: $id\n";      #  'ID: 1'


#  2.
#  Insert one row to 'item' with name = 'Banana'.
#  category_id and price will be random values.

$id = $hd->insert('item', { name => 'Banana' });  #  Maybe $id == 2

#  Result example:
#  [item]
#           id: 2
#  category_id: 497364651
#         name: Banana
#        price: 337640949
#
#  [category]
#           id: 497364651
#         name: name_497364651


#  3.
#  Insert one row to 'item' with category_id one of 10, 20 or 30 (selected randomly).
#  If table 'category' has no record with id = 10, 20 nor 30,
#  a record having one of those ids will be generated on 'category'.

$hd->insert('item', { category_id => [ 10, 20, 30 ] });

#  Result example:
#  [item]
#           id: 3
#  category_id: 20
#         name: name_3
#        price: 587323402
#
#  [category]
#           id: 20
#         name: name_20


#  4.
#  If you're interested also in category name, do this.

$cat_id = $hd->insert('category', { name => 'Fruit' });
$item_id = $hd->insert('item', { category_id => $cat_id, name => 'Coconut' });


#  Delete all records inserted by $hd
$hd->delete_all();

#  ...Or retrieve all IDs for later deletion.
my $ids = $hd->inserted();

DESCRIPTION

This module generates test data and insert it into mysql tables. You only have to specify values of columns you're really interested in. Other necessary values are generated automatically.

When we test our product, sometimes we need to create test records, but generating them is a tedious task. We should consider many constraints (not null, foreign key, etc.) and set values to many columns in many tables, even if we want to do small tests, are interested in only a few columns and don't want to care about others. Maybe this module get rid of much of those unnecessary task.

METHODS

new(dbh => $dbh, fk => $fk)

Constructor. dbh is required to be specified at here, or by calling $obj->dbh($dbh) later. fk is optional.

dbh($dbh)

set a database handle

fk($flag)

If specified 1, it also creates records on other tables referred by foreign key columns in main table, if necessary.

Default is 0 (doesn't add records to other tables), so if you want to use this functionality, you need to specify 1 explicitly.

insert($table_name, $valspec)

Inserts a record to a table named $table_name.

You can specify values of each column(s) with $valspec, a hashref which keys are columns' names in $table_name.

$hd->insert('table1', {
    id      => 5,
    price   => 300
});

format

  • colname => $scalar

    specifies a value of 'colname'

      $hd->insert('table1', { id => 5 });      #  id will become 5
    
  • colname => [ $val1, $val2, ... ]

    value of 'colname' will be randomly chosen from $val1, $val2, ...

      $hd->insert('table1', { id => [ 10, 20, 30 ] })      #  id will become one of 10, 20 or 30
    
  • colname => { random => [ $val1, $val2, ... ] }

    verbose expression of above

  • colname => qr/$pattern/

    value of 'colname' is determined by $pattern.

    NOTE: This function uses randregex of String::Random, which does not handles real regular expression.

      $hd->insert('table1', { filename => qr/[0-9a-f]{8}\.jpg/ });  #  'a1b2c3d4.jpg'
    
  • colname => { random => qr/$pattern/ }

    verbose expression of above

  • colname => { range => [ $min, $max ] }

    value of 'colname' is determined between $min and $max ($min inclusive, $max exclusive). Can be used only for number(int, double, numeric, etc.).

  • colname => { dt_range => [ $start_datetime, $end_datetime ] }

    value of 'colname' is determined between $start_datetime and $end_datetime ($start_datetime inclusive, $end_datetime exclusive). Can be used only for date or datetime type.

      $hd->insert('table1', {
          purchase_datetime => { dt_range => [ '2013-07-20 12:00:00', '2013-7-21 14:00:00' ] }
      });
    
      $hd->insert('table2', {
          exec_datetime => { dt_range => [ '2013-08-01', '2013-08-05' ] }     #  time can be ommitted
      });
    

return value

Returns a value of primary key. (Only when primary key exists and it contains only a single column. Otherwise returns undef.)

inserted()

Returns all primary keys of inserted records by this instance. Returned value is a hashref like this:

my $ret = $hd->inserted();

#  $ret = {
#    'table_name1' => [ 10, 11 ],
#    'table_name2' => [ 100, 110, 120 ],
#  };

CAUTION: inserted() ignores records with no primary key, or primary key with multiple columns.

delete_all()

deletes all rows inserted by this instance.

CAUTION: delete_all() won't delete rows in tables which don't have primary key, or which have primary key with multiple columns.

BUGS AND LIMITATIONS

There are still many limitations with this module. I'll fix them later.

Please report problems to Egawata (egawa.takashi at gmail com) Patches are welcome.

Only primary key with single column is supported.

Although it works when inserting a record into a table which primary key consists of multiple columns, insert() won't return a value of primary key just inserted.

Foreign key constraint which has multiple columns is not supported.

For now, if you want to use this module with such a table, specify those values explicitly.

Multiple foreign key constraints to the same column are not supported.

For now, if you want to use this module with such a table, specify those values explicitly.

Some data types are not supported.

For example, blob or set aren't supported. The values of those columns won't be auto-generated.

AUTHOR

Takashi Egawa (egawa.takashi at gmail com)

LICENCE AND COPYRIGHT

Copyright (c)2012-2018 Takashi Egawa (egawa.takashi at gmail com). All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

data-handygen-mysql's People

Contributors

egawata avatar

Stargazers

youpong avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.