Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to DBIx::Lite - Kyoto.pm tech talk #2

motemen
August 18, 2012

Introduction to DBIx::Lite - Kyoto.pm tech talk #2

motemen

August 18, 2012
Tweet

More Decks by motemen

Other Decks in Technology

Transcript

  1. Initialization •Passing $dbh •Using DBIx::Connector my $dbix = DBIx::Lite->new(dbh =>

    $dbh); my $dbix = DBIx::Lite->connect( 'dbi:mysql:dbname=...', $username, $password, { mysql_enable_utf8 => 1, RootClass => 'DBIx::Sunny', }, );
  2. SELECT •Build ResultSet by method chain •Finally retrieve row objects

    my $entries_rs = $dbix->table('entries') ->search({ author_id => 1 }) ->order_by('created_at'); my @entries = $entries_rs->all; # SELECT me.* FROM entries AS me WHERE ( author_id = '1' ) ORDER BY created_at my $entry = $entries_rs->limit(1)->single; # SELECT me.* FROM entries AS me WHERE ( author_id = '1' ) ORDER BY created_at LIMIT 1 OFFSET 0
  3. INSERT •If the table has an auto- incremented pkey, LAST_INSERT_ID

    is filled in my $entry = $dbix->table('entries')->insert({ author_id => 47, body => '…', created_at => time(), }); # INSERT INTO entries ( author_id, body, created_at) VALUES ( '47', '…', '1345196410' )
  4. UPDATE/DELETE $dbix->table('entries') ->search({ id => [ 2, 3, 5 ]

    }) ->update({ body => '…' }); # UPDATE entries AS me SET body = '…' WHERE ( ( id = '2' OR id = '3' OR id = '5' ) ) $dbix->schema->table('entries')->pk('id'); $entry->update({ body => '…' }); # UPDATE entries AS me SET body = '…' WHERE ( id = '1' )
  5. DBIL::ResultSet •Represents a set of database rows •Has most major

    methods •Does not hold actual data in itself •To retrieve row objects: my @all = $rs->all; my $row = $rs->single;
  6. DBIL::ResultSet •Chain methods to build specific result set •search() uses

    SQL::Abstract •Multiple search()’es joined by “AND” $rs = $dbix->table(…); $rs = $rs->search(\%where); # WHERE $rs = $rs->order_by($col); # ORDER BY $rs = $rs->limit($n); # LIMIT $rs = $rs->select(@cols); # SELECT
  7. DBIL::Schema & DBIL::Schema::Table •Represents metadata of tables •(Auto-increment) primary keys

    •Row classes, ResultSet classes •Has-a, has-many relationships
  8. DBIL::Schema & DBIL::Schema::Table •Setting primary key lets row objects’ update

    methods to work •Use autopk() for auto-inc pk •Give row objects custom methods from the package $dbix->schema->table('entries')->pk('id'); $dbix->schema->table('entries') ->class('My::Row::Entry');
  9. DBIL::Schema & DBIL::Schema::Table •Register has-many relations •ResultSet gains relation method

    $dbix->schema->one_to_many( 'authors.id' => 'entries.author_id' ); my @entries = $dbix->table('authors') ->search({ name => 'motemen' }) ->entries->all; # SELECT entries.* FROM authors AS me INNER JOIN entries ON ( me.id = entries.author_id ) WHERE ( name = 'motemen' )
  10. Paging •Paging by offset/limit my $entries_rs = $dbix->table('entries') ->rows_per_page(10)->page(3); $entries_rs->all;

    # SELECT COUNT(*) FROM entries AS me LIMIT 10 OFFSET 0 # SELECT me.* FROM entries AS me LIMIT 10 OFFSET 20 my $pager = $entries_rs->pager; # => Data::Page
  11. JOIN •Use $rs->select_also() to fetch joined tables $dbix->table('entries') ->left_join('authors', {

    author_id => 'id' }) ->select_also([ 'authors.name' => 'author_name' ]) ->all; # SELECT me.*, authors.name AS `author_name` FROM entries AS me LEFT OUTER JOIN authors ON ( me.author_id = authors.id )
  12. CAVEATS •“SELECT me.* FROM …” queries •Sometimes need to prefix

    “me.” to field names •Row classes are not automatically require’d
  13. HACKING •Auto-upgrade connection to master •Need to alter DBIx::Lite and

    produced DBIL::ResultSet •Use Role::Tiny •gist:3378389
  14. Sum up •Simple APIs •ResultSet •No need to declare classes,

    easy to start •Extending may need tricks