Your SlideShare is downloading. ×
0
Introduction to   DBIx::Lite    id:motemen
me• id:motemen• motemen 美顔器• Application engineer • DBIx::MoCo maintainer
ORM and me• DBIx::MoCo• DBIx::Skinny• Data::Model• Teng
DBIx::Lite• AUTHOR cpan:AAR• “Chained and minimal ORM”• cf. DBIx::Class
SYNOPSIS
Preparation• No classes required to declare • e.g. schemas, row classes• Just use
Initialization• Passing $dbh  my $dbix = DBIx::Lite->new(dbh => $dbh);• Using DBIx::Connector  my $dbix = DBIx::Lite->conn...
CRUD  my $entries = $dbix->table(entries);• Call table() to start building query• Returns ResultSet object
SELECT• Build ResultSet by method chain  my $entries_rs = $dbix->table(entries)      ->search({ author_id => 1 })      ->o...
INSERTmy $entry = $dbix->table(entries)->insert({    author_id => 47,    body => …,    created_at => time(),});# INSERT IN...
UPDATE/DELETE$dbix->table(entries)    ->search({ id => [ 2, 3, 5 ] })    ->update({ body => … });# UPDATE entries AS me SE...
Components
• DBIx::Lite • DBIx::Lite::ResultSet • DBIx::Lite::Row • DBIx::Lite::Schema • DBIx::Lite::Schema::Table
DBIx::Lite• Represents a database (connection)• $dbix->{connector} • isa DBIx::Connector• $dbix->{schema} • isa DBIx::Lite...
DBIL::ResultSet• Represents a set of database rows• Has most major methods• Does not hold actual data in itself • To retri...
DBIL::ResultSet• Chain methods to build specific  result set  $rs   =   $dbix->table(…);  $rs   =   $rs->search(%where);   ...
DBIL::Row•Represents a database row•Simple structure •$row->{data}, $row->{dbix_lite} •$row->hashref•No inflates/deflates•AU...
DBIL::Row• Row operation methods • $row->update(%cols) • $row->delete• pk needed in schema (next)
DBIL::Schema& DBIL::Schema::Table• Represents metadata of tables • (Auto-increment) primary keys • Row classes, ResultSet ...
DBIL::Schema& DBIL::Schema::Table• Setting primary key lets row objects’  update methods to work • Use autopk() for auto-i...
DBIL::Schema& DBIL::Schema::Table• Register has-many relations  $dbix->schema->one_to_many(      authors.id => entries.aut...
Other features
Paging• Paging by offset/limit  my $entries_rs = $dbix->table(entries)      ->rows_per_page(10)->page(3);  $entries_rs->al...
JOIN$dbix->table(entries)->left_join(authors, { author_id => id })->select_also([ authors.name => author_name ])->all;# SE...
Raw DBI accessmy $now = $dbix->dbh_do(sub {    $_->selectcol_arrayref(SELECT NOW())->[0]});• Internally uses DBIx::Connect...
CAVEATS• “SELECT me.* FROM …” queries • Sometimes need to prefix “me.” to   field names• Row classes are not automatically  ...
HACKING• Auto-upgrade connection to master• Need to alter DBIx::Lite and  produced DBIL::ResultSet• Use Role::Tiny• gist:3...
Sum up• Simple APIs• ResultSet• No need to declare classes,  easy to start• Extending may need tricks
Questions?
Upcoming SlideShare
Loading in...5
×

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

3,308

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,308
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Transcript of "Introduction to DBIx::Lite - Kyoto.pm tech talk #2"

    1. 1. Introduction to DBIx::Lite id:motemen
    2. 2. me• id:motemen• motemen 美顔器• Application engineer • DBIx::MoCo maintainer
    3. 3. ORM and me• DBIx::MoCo• DBIx::Skinny• Data::Model• Teng
    4. 4. DBIx::Lite• AUTHOR cpan:AAR• “Chained and minimal ORM”• cf. DBIx::Class
    5. 5. SYNOPSIS
    6. 6. Preparation• No classes required to declare • e.g. schemas, row classes• Just use
    7. 7. Initialization• Passing $dbh my $dbix = DBIx::Lite->new(dbh => $dbh);• Using DBIx::Connector my $dbix = DBIx::Lite->connect( dbi:mysql:dbname=..., $username, $password, { mysql_enable_utf8 => 1, RootClass => DBIx::Sunny, }, );
    8. 8. CRUD my $entries = $dbix->table(entries);• Call table() to start building query• Returns ResultSet object
    9. 9. SELECT• Build ResultSet by method chain my $entries_rs = $dbix->table(entries) ->search({ author_id => 1 }) ->order_by(created_at);• Finally retrieve row objects 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
    10. 10. INSERTmy $entry = $dbix->table(entries)->insert({ author_id => 47, body => …, created_at => time(),});# INSERT INTO entries ( author_id, body, created_at)VALUES ( 47, …, 1345196410 )• If the table has an auto- incremented pkey, LAST_INSERT_ID is filled in
    11. 11. UPDATE/DELETE$dbix->table(entries) ->search({ id => [ 2, 3, 5 ] }) ->update({ body => … });# UPDATE entries AS me SET body = … WHERE ( ( id = 2 ORid = 3 OR id = 5 ) )$dbix->schema->table(entries)->pk(id);$entry->update({ body => … });# UPDATE entries AS me SET body = … WHERE ( id = 1 )
    12. 12. Components
    13. 13. • DBIx::Lite • DBIx::Lite::ResultSet • DBIx::Lite::Row • DBIx::Lite::Schema • DBIx::Lite::Schema::Table
    14. 14. DBIx::Lite• Represents a database (connection)• $dbix->{connector} • isa DBIx::Connector• $dbix->{schema} • isa DBIx::Lite::Schema• Generates ResultSet (next)
    15. 15. 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;
    16. 16. DBIL::ResultSet• Chain methods to build specific result set $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• search() uses SQL::Abstract• Multiple search()’es joined by “AND”
    17. 17. DBIL::Row•Represents a database row•Simple structure •$row->{data}, $row->{dbix_lite} •$row->hashref•No inflates/deflates•AUTOLOAD method names
    18. 18. DBIL::Row• Row operation methods • $row->update(%cols) • $row->delete• pk needed in schema (next)
    19. 19. DBIL::Schema& DBIL::Schema::Table• Represents metadata of tables • (Auto-increment) primary keys • Row classes, ResultSet classes • Has-a, has-many relationships
    20. 20. DBIL::Schema& DBIL::Schema::Table• Setting primary key lets row objects’ update methods to work • Use autopk() for auto-inc pk $dbix->schema->table(entries)->pk(id);• Give row objects custom methods from the package $dbix->schema->table(entries) ->class(My::Row::Entry);
    21. 21. DBIL::Schema& DBIL::Schema::Table• Register has-many relations $dbix->schema->one_to_many( authors.id => entries.author_id );• ResultSet gains relation method 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 )
    22. 22. Other features
    23. 23. 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
    24. 24. JOIN$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 )• Use $rs->select_also() to fetch joined tables
    25. 25. Raw DBI accessmy $now = $dbix->dbh_do(sub { $_->selectcol_arrayref(SELECT NOW())->[0]});• Internally uses DBIx::Connector#run
    26. 26. CAVEATS• “SELECT me.* FROM …” queries • Sometimes need to prefix “me.” to field names• Row classes are not automatically require’d
    27. 27. HACKING• Auto-upgrade connection to master• Need to alter DBIx::Lite and produced DBIL::ResultSet• Use Role::Tiny• gist:3378389
    28. 28. Sum up• Simple APIs• ResultSet• No need to declare classes, easy to start• Extending may need tricks
    29. 29. Questions?
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×