SlideShare a Scribd company logo
1 of 98
Download to read offline
DBIx::Class (aka DBIC)
       for (advanced) beginners



    Leo Lapworth @ YAPC::EU 2010

     http://leo.cuckoo.org/projects/
assumptions

   You know a little about Perl
   and using objects

   You know a little bit about
   databases and using foreign
   keys
DBIx::Class?
•   ORM (object relational mapper)

•   SQL <-> OO (using objects instead of SQL)

•   Simple, powerful, complex, fab and confusing

•   There are many ORMs, DBIx::Class just happens to
    be the best in Perl (personal opinion)
why this talk?
• Help avoid mistakes I made!
• Help learn DBIx::Class faster
• Make your coding easier
table setup
example...

Books




Authors
authors table

CREATE TABLE authors(

 id     int(8) primary key auto_increment,

 name   varchar(255)

) engine = InnoDB DEFAULT CHARSET=utf8;
tips

Name tables as simple plurals (add an S) -
makes relationships easier to understand
(issue: Matt Trout "Tables should not be plural as gives you plurals for Result::
package names which represent a single row" - talk may be rewritten in future
to reflect this as this is better once you understand the relationship setup -
either way, consistency is important)


Use a character set (UTF8) from the start
(for international characters)
authors table

CREATE TABLE author   s(
 id     int(8) primary key auto_increment,

 name   varchar(255)

) engine =   InnoDB   DEFAULT CHARSET=   utf8;
books table
CREATE TABLE books(

 id      int(8) primary key auto_increment,

 title   varchar(255),

 author int(8),

 foreign key (author)

             references authors(id)

) engine = InnoDB DEFAULT CHARSET=utf8;
tips


Name link fields as singular


Check foreign key is the same field type and
size in both tables
books table
CREATE TABLE books(
 id      int(8) primary key auto_increment,
 title   varchar(255),
 author int(8),

 foreign key (   author)
             references   authors(id)
) engine = InnoDB DEFAULT CHARSET=utf8;
CRUD compared
    C - Create
    R - Retrieve
    U - Update
    D - Delete
Manual (SQL)
manual: create
my $sth = $dbh->prepare('
 INSERT INTO books
 (title, author)
 values (?,?)
');


$sth->execute(
   'A book title',$author_id
);
manual: create
my $sth = $dbh->prepare('
 INSERT INTO books
 (title, author)
 values (?,?)
');


$sth->execute(
     'A book title',   $author_id
);
manual: retrieve
my $sth = $dbh->prepare('
  SELECT title,
  authors.name as author_name
  FROM books, authors
  WHERE books.author = authors.id
');
manual: retrieve
while( my $book = $sth->fetchrow_hashref() )
{
    print 'Author of '
        . $book->{title}
       . ' is '
       . $book->{author_name}
       . "n";
}
manual: update
my $update = $dbh->prepare('
 UPDATE books
 SET title = ?
 WHERE id = ?
');


$update->execute(
  'New title',   $book_id);
manual: delete
my $delete = $dbh->prepare('
 DELETE FROM books
 WHERE id = ?
');


$delete->execute(   $book_id);
DBIx::Class
DBIC: create
my $book = $book_model->create({
 title => 'A book title',
 author => $author_id,
});

Look ma, no SQL!

Tip: do not pass in primary_key field, even if its empty/undef as the
object returned will have an empty id, even if your field is auto
increment.
DBIC: create
my $book = $book_model->create({
 title => 'A book title',

 author =>   $author_id,
});
DBIC: create
my $pratchett = $author_model->create({
  name => 'Terry Pratchett',
});
DBIC: create
my $book = $pratchett->create_related(
     'books', {
       title => 'Another Discworld book',
});
or
my $book = $pratchett->add_to_books({
       title => 'Another Discworld book',
});
DBIC: create
my $book = $pratchett->create_related(
     'books', {
       title => 'Another Discworld book',
});
or
my $book = $pratchett->add_to_books({
       title => 'Another Discworld book',
});
DBIC: retrieve

DBIx::Class - Lots of ways to do the same thing...

"There is more than one way to do it (TIMTOWTDI,
usually pronounced "Tim Toady") is a Perl motto"
DBIC: retrieve
my $book = $book_model->find($book_id);


my $book = $book_model->search({
 title => 'A book title',
})->single();


my @books = $book_model->search({
 author => $author_id,
})->all();
DBIC: retrieve
while( my $book = $books_rs->next() ) {
    print 'Author of '
        . $book->title()
       . ' is '
       . $book->author()->name()
       . "n";
}
DBIC: retrieve
my $books_rs = $book_model->search({
 author => $author_id,
});




Search takes SQL::Abstract formatted queries
> perldoc SQL::Abstract
DBIC: update
$book->update({
  title => 'New title',
});
DBIC: delete
$book->delete();
Creating schemas
too much
  typing!

  too much
maintenance!
Schema::Loader


 Database introspection -> Code
Use namespaces
Use Namespaces
           Splits logic cleanly



Bookstore::Schema::Result::X

              = an individual row

Bookstore::Schema:: ResultSet::X

              = searches / results
You can edit this line
Connection details
using your Schema
DEBUGGING
DBIC_TRACE=1 ./your_script.pl
SQL - debugging

INSERT INTO authors (name)
      VALUES (?): 'Douglas Adams'


INSERT INTO books (author, title)
      VALUES (?, ?): '1', '42'
overloading

Bookstore::Schema::Result::Books
Bookstore::Schema::ResultSet::Books
Bookstore::Schema::Result::Authors
Bookstore::Schema::ResultSet::Authors
Result::
package Bookstore::Schema::Result::Books;
use base 'DBIx::Class';

#...

# Created by DBIx::Class::Schema::Loader v0.04005 @ 2010-08-01 09:19:1
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ta+cEh31lDfqcue3OmUCfQ

sub isbn {
  my $self = shift;

    # search amazon or something
    my $api = Amazon::API->book({
         title => $self->title()
    });

    return $api->isbn();
}

1;
Result::
package Bookstore::Schema::Result::Books;
use base 'DBIx::Class';

#...

# Created by DBIx::Class::Schema::Loader v0.04005 @ 2010-08-01 09:19:1
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ta+cEh31lDfqcue3OmUCfQ

sub isbn {
  my $self = shift;

    # search amazon or something
    my $api = Amazon::API->book({
         title => $self->title()
    });

    return $api->isbn();
}

1;
Result::
print $book->isbn();
Result:: (inflating)
package Bookstore::Schema::Result::Books;
use base 'DBIx::Class';

#...

use DateTime::Format::MySQL;

__PACKAGE__->inflate_column(
    'date_published',
    {   inflate => sub {
            DateTime::Format::MySQL->parse_date(shift);
        },
        deflate => sub {
            shift->ymd();
        },
    }
);
# Automatic see: DBIx::Class::InflateColumn::DateTime
Result:: (inflating)
package Bookstore::Schema::Result::Books;
use base 'DBIx::Class';

#...

use DateTime::Format::MySQL;

__PACKAGE__->inflate_column(
    'date_published',
    {   inflate => sub {
             DateTime::Format::MySQL->parse_date(shift);
           },
           deflate => sub {
               shift->ymd();
           },
       }
);
# Automatic see: DBIx::Class::InflateColumn::DateTime
Result:: (deflating)
$book->date_published(DateTime->now);

$book->update();




                                        2008-12-31
Result:: (inflating)
my $date_published = $book->date_published()
print $date_published->month_abbr();




                Nov
ResultSets::
package Bookstore::Schema::ResultSet::Books;
use base 'DBIx::Class::ResultSet';

#...

sub the_ultimate_books {
    my $self = shift;

       return $self->search(
           {   title => {
                   'like', '%42%'
           }
       });
}

sub by_author {
    my ( $self, $author ) = @_;

       return $self->search( { author => $author->id(), } );
}
ResultSets::
package Bookstore::Schema::ResultSet::Books;
use base 'DBIx::Class::ResultSet';
#...
sub the_ultimate_books {
     my $self = shift;

        return $self->search(
            {   title => {
                    'like', '%42%'
            }
        });
}

sub by_author {
    my ( $self, $author ) = @_;

    return $self->search( { author => $author->id(), } );
}
ResultSets::
package Bookstore::Schema::ResultSet::Books;
use base 'DBIx::Class::ResultSet';
#...
sub the_ultimate_books {
    my $self = shift;

    return $self->search(
        {   title => {
                'like', '%42%'
        }
    });
}


sub by_author {
    my ( $self, $author ) = @_;

     return $self->search( {
       author => $author->id(),
    } );
}
ResultSets::
use Bookstore::Schema;

my $book_model   = Bookstore::Schema->resultset('Books');

my $book_rs      = $book_model->the_ultimate_books();

my @books        = $book_rs->all();
ResultSets::chaining
use Bookstore::Schema;

my $book_model   = Bookstore::Schema->resultset('Books');
my $author_model = Bookstore::Schema->resultset('Authors');

my $author = $author_model->search({
        name => 'Douglas Adams',
})->single();

my $book_rs = $book_model->the_ultimate_books()
                         ->by_author($author);

my @books = $book_rs->all();
ResultSets::chaining
my $book_rs = $book_model
               ->the_ultimate_books()
               ->by_author($author);
or

my $book_rs = $book_model
                ->the_ultimate_books();
$book_rs = $book_rs->by_author($author);
# Debug (SQL):

# SELECT me.id, me.title, me.date_published, me.author
#   FROM books me
#   WHERE ( ( ( author = ? ) AND ( title LIKE ? ) ) ): '1', '%42%'
ResultSets::chaining
my $rs = $book_model
            ->category('childrens')
            ->by_author($author)
            ->published_after('1812')
            ->first_page_contains('once upon')
            ->rating_greater_than(4);

my @books = $rs->all();
overloading before
    new record
overloading before
        new record
package Bookstore::Schema::Result::Authors;
use base 'DBIx::Class';

sub new {
    my ( $class, $attrs ) = @_;

     # Mess with $attrs

     my $new = $class->next::method($attrs);
     return $new;
}

1;
relationships
multiple authors
a few relationships
     has_many                has_many

Authors         Authors_and_Books       Books


    belongs_to             belongs_to

            many_to_many
a few relationships



        !
new join table
CREATE TABLE author_and_books(
    id      int(8)    primary key auto_increment,
    book ! int(8),
    author int(8),

    foreign key (book)     references books(id),
    foreign key (author)   references authors(id)

) engine = InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `books` DROP COLUMN `author`;
new join table
CREATE TABLE author_and_books(
    id      int(8)    primary key auto_increment,
    book ! int(8),
    author int(8),

    foreign key (book)     references books(id),
    foreign key (author)   references authors(id)

) engine = InnoDB DEFAULT CHARSET=utf8;
has_many
        has_many


Books           Authors_and_Books




        belongs_to
has_many
package Bookstore::Schema::Result::Books;

__PACKAGE__->has_many(

     "author_and_books",

     "Bookstore::Schema::Result::AuthorAndBooks",

     { "foreign.book" => "self.id" },


);

# This is auto generated by Schema::Loader
has_many
package Bookstore::Schema::Result::Books;

__PACKAGE__->has_many(

     "author_and_books",
        # Name of accessor
     "Bookstore::Schema::Result::AuthorAndBooks",
        # Related class
     { "foreign.book" => "self.id" },
        # Relationship (magic often works if not
        # specified, but avoid!)
);
belongs_to
        has_many


Books           Authors_and_Books




        belongs_to
belongs_to
package Bookstore::Schema::Result::AuthorAndBooks;


__PACKAGE__->belongs_to(
    "book",
    "Bookstore::Schema::Result::Books",
    { id => "book" }
);

# This is auto generated by Schema::Loader
belongs_to
package Bookstore::Schema::Result::AuthorAndBooks;


__PACKAGE__->belongs_to(
    "book",                     # Accessor name
    "Bookstore::Schema::Result::Books",
             # Related class
    { id => "book" }            # Relationship
);
same for Authors

     has_many

Authors         Authors_and_Books



    belongs_to
with no coding...

     has_many                has_many

Authors         Authors_and_Books       Books


    belongs_to             belongs_to
many_to_many

     has_many                has_many

Authors         Authors_and_Books       Books


    belongs_to             belongs_to

            many_to_many
many_to_many
package Bookstore::Schema::Result::Books;
use base 'DBIx::Class';

__PACKAGE__->many_to_many(
    "authors"

         => "author_and_books",

     'author'
);

1;

# This is   NOT   auto generated by Schema::Loader
many_to_many
package Bookstore::Schema::Result::Books;
use base 'DBIx::Class';

__PACKAGE__->many_to_many(
    "authors"
    # Accessor Name
        => "author_and_books",
        # has_many accessor_name
    'author'
    # foreign relationship name
);

1;
many_to_many
package Bookstore::Schema::Result::Authors;
use base 'DBIx::Class';

__PACKAGE__->many_to_many(
    "books"
    # Accessor Name
        => "author_and_books",
        # has_many accessor_name
    'book'
    # foreign relationship name
);

1;

# This is   NOT   auto generated by Schema::Loader
using many_to_many
#!/usr/bin/perl

use Bookstore::Schema;

my $author_model = Bookstore::Schema->resultset('Authors');

my $author = $author_model->search({
  name => 'Douglas Adams',
})->single();

$author->add_to_books({
  title => 'A new book',
});
using many_to_many
my $author = $author_model->search({
  name => 'Douglas Adams',
})->single();

$author->add_to_books({
  title => 'A new book',
});

# SELECT me.id, me.name FROM authors me
#     WHERE ( name = ? ): 'Douglas Adams';

# INSERT INTO books (title) VALUES (?): 'A new book';

# INSERT INTO author_and_books (author, book)
#     VALUES (?, ?): '5', '2';
using many_to_many
$author->add_to_books($book);


$book->add_to_authors($author_1);

$book->add_to_authors($author_2);
in 16 lines of code
     has_many                has_many

Authors         Authors_and_Books       Books


    belongs_to             belongs_to

            many_to_many
errors


 Read them closely!
error messages
DBIx::Class::Schema::Loader::connection
(): Failed to load external class
definition for
'Bookstore::Schema::Result::Authors':
Can't locate object method
"many_to_many" via package
"Bookstore::Schema::Result::Author" at
lib/Bookstore/Schema/Result/Authors.pm
line 9.
Compilation failed in require at /
Library/Perl/5.8.8/DBIx/Class/Schema/
Loader/Base.pm line 292.
error messages
DBIx::Class::Schema::Loader::connection
(): Failed to load external class
definition for
'Bookstore::Schema::Result::Authors':
Can't locate object method
"many_to_many" via package
"Bookstore::Schema::Result::Author" at
lib/Bookstore/Schema/Result/Authors.pm
line 9.
Compilation failed in require at /
Library/Perl/5.8.8/DBIx/Class/Schema/
Loader/Base.pm line 292.
errors

• Turn on debugging
• Read error messages (sometimes useful!)
• Check field names
• Check package names
• Check which database you are connected
  to (development/test/live?) - repeat above
thanks

http://leo.cuckoo.org/projects/

    Time for bonus slides?
Template Toolkit


• [% author.books.count %] not working?
• TT all methods are called in list context
• [% author.books_rs.count %] scalar context
        Available for all relationships
Catalyst
package Your::App::Model::Bookstore;
use base qw(Catalyst::Model::DBIC::Schema);

use strict;
use warnings;

__PACKAGE__->config(
   schema_class => 'Bookstore::Schema',
);

1;
Catalyst
package Your::App::Model::Bookstore;
use base qw(Catalyst::Model::DBIC::Schema);

use strict;
use warnings;

__PACKAGE__->config(
   schema_class => 'Bookstore::Schema',
);

1;



            Keep your Scheme in a separate
          package to your Catalyst application
Catalyst
sub action_name : Local {
  my ($self, $c) = @_;

     my $model = $c->model('Bookstore');
     my $author_model = $model->resultset('Authors');

}

1;
thanks!


http://leo.cuckoo.org/projects/

More Related Content

What's hot (20)

Perl Scripting
Perl ScriptingPerl Scripting
Perl Scripting
 
Perl 5.10 for People Who Aren't Totally Insane
Perl 5.10 for People Who Aren't Totally InsanePerl 5.10 for People Who Aren't Totally Insane
Perl 5.10 for People Who Aren't Totally Insane
 
Neatly folding-a-tree
Neatly folding-a-treeNeatly folding-a-tree
Neatly folding-a-tree
 
Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl Techniques
 
Improving Dev Assistant
Improving Dev AssistantImproving Dev Assistant
Improving Dev Assistant
 
Perl Presentation
Perl PresentationPerl Presentation
Perl Presentation
 
Perl programming language
Perl programming languagePerl programming language
Perl programming language
 
PHP Functions & Arrays
PHP Functions & ArraysPHP Functions & Arrays
PHP Functions & Arrays
 
Lists and arrays
Lists and arraysLists and arrays
Lists and arrays
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
 
Perl6 Regexen: Reduce the line noise in your code.
Perl6 Regexen: Reduce the line noise in your code.Perl6 Regexen: Reduce the line noise in your code.
Perl6 Regexen: Reduce the line noise in your code.
 
Class 4 - PHP Arrays
Class 4 - PHP ArraysClass 4 - PHP Arrays
Class 4 - PHP Arrays
 
Introducing Modern Perl
Introducing Modern PerlIntroducing Modern Perl
Introducing Modern Perl
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
Working with text, Regular expressions
Working with text, Regular expressionsWorking with text, Regular expressions
Working with text, Regular expressions
 
perl usage at database applications
perl usage at database applicationsperl usage at database applications
perl usage at database applications
 
PHP Unit 4 arrays
PHP Unit 4 arraysPHP Unit 4 arrays
PHP Unit 4 arrays
 
Bioinformatics p1-perl-introduction v2013
Bioinformatics p1-perl-introduction v2013Bioinformatics p1-perl-introduction v2013
Bioinformatics p1-perl-introduction v2013
 
Sorting arrays in PHP
Sorting arrays in PHPSorting arrays in PHP
Sorting arrays in PHP
 
Subroutines
SubroutinesSubroutines
Subroutines
 

Viewers also liked

Database Programming with Perl and DBIx::Class
Database Programming with Perl and DBIx::ClassDatabase Programming with Perl and DBIx::Class
Database Programming with Perl and DBIx::ClassDave Cross
 
Introduction to Computer and Programming - Lecture 03
Introduction to Computer and Programming - Lecture 03Introduction to Computer and Programming - Lecture 03
Introduction to Computer and Programming - Lecture 03hassaanciit
 
Introduction to Computer and Programing - Lab2
Introduction to Computer and Programing - Lab2Introduction to Computer and Programing - Lab2
Introduction to Computer and Programing - Lab2hassaanciit
 
Introduction to Computer and Programming - Lecture 02
Introduction to Computer and Programming - Lecture 02Introduction to Computer and Programming - Lecture 02
Introduction to Computer and Programming - Lecture 02hassaanciit
 
PowerPoint for Introduction to Office 2010
PowerPoint for Introduction to Office 2010PowerPoint for Introduction to Office 2010
PowerPoint for Introduction to Office 2010mindysholder
 
Introduction to Computer and Programing - Lecture 04
Introduction to Computer and Programing - Lecture 04Introduction to Computer and Programing - Lecture 04
Introduction to Computer and Programing - Lecture 04hassaanciit
 
Intro To Programming Concepts
Intro To Programming ConceptsIntro To Programming Concepts
Intro To Programming ConceptsJussi Pohjolainen
 
Introduction to Computer and Programming - Lecture 01
Introduction to Computer and Programming - Lecture 01Introduction to Computer and Programming - Lecture 01
Introduction to Computer and Programming - Lecture 01hassaanciit
 
Basic programming concepts
Basic programming conceptsBasic programming concepts
Basic programming conceptssalmankhan570
 
MS OFFICE 2010 VS 2007
MS OFFICE 2010 VS 2007MS OFFICE 2010 VS 2007
MS OFFICE 2010 VS 2007Gurpreet Singh
 
An introduction to microsoft office 2007 lecture
An introduction to microsoft office 2007 lectureAn introduction to microsoft office 2007 lecture
An introduction to microsoft office 2007 lectureSukh Sandhu
 
Database Design Slide 1
Database Design Slide 1Database Design Slide 1
Database Design Slide 1ahfiki
 
CS101- Introduction to Computing- Lecture 33
CS101- Introduction to Computing- Lecture 33CS101- Introduction to Computing- Lecture 33
CS101- Introduction to Computing- Lecture 33Bilal Ahmed
 
Database management system presentation
Database management system presentationDatabase management system presentation
Database management system presentationsameerraaj
 

Viewers also liked (18)

Database Programming with Perl and DBIx::Class
Database Programming with Perl and DBIx::ClassDatabase Programming with Perl and DBIx::Class
Database Programming with Perl and DBIx::Class
 
Introduction to Computer and Programming - Lecture 03
Introduction to Computer and Programming - Lecture 03Introduction to Computer and Programming - Lecture 03
Introduction to Computer and Programming - Lecture 03
 
Introduction to Computer and Programing - Lab2
Introduction to Computer and Programing - Lab2Introduction to Computer and Programing - Lab2
Introduction to Computer and Programing - Lab2
 
Introduction to Computer and Programming - Lecture 02
Introduction to Computer and Programming - Lecture 02Introduction to Computer and Programming - Lecture 02
Introduction to Computer and Programming - Lecture 02
 
PowerPoint for Introduction to Office 2010
PowerPoint for Introduction to Office 2010PowerPoint for Introduction to Office 2010
PowerPoint for Introduction to Office 2010
 
Introduction to Computer and Programing - Lecture 04
Introduction to Computer and Programing - Lecture 04Introduction to Computer and Programing - Lecture 04
Introduction to Computer and Programing - Lecture 04
 
Intro To Programming Concepts
Intro To Programming ConceptsIntro To Programming Concepts
Intro To Programming Concepts
 
Introduction to Computer and Programming - Lecture 01
Introduction to Computer and Programming - Lecture 01Introduction to Computer and Programming - Lecture 01
Introduction to Computer and Programming - Lecture 01
 
Using Computer Keyboard
Using Computer KeyboardUsing Computer Keyboard
Using Computer Keyboard
 
Basic programming concepts
Basic programming conceptsBasic programming concepts
Basic programming concepts
 
Ms word 2010 by sachin sharma
Ms word 2010 by sachin sharmaMs word 2010 by sachin sharma
Ms word 2010 by sachin sharma
 
MS OFFICE 2010 VS 2007
MS OFFICE 2010 VS 2007MS OFFICE 2010 VS 2007
MS OFFICE 2010 VS 2007
 
An introduction to microsoft office 2007 lecture
An introduction to microsoft office 2007 lectureAn introduction to microsoft office 2007 lecture
An introduction to microsoft office 2007 lecture
 
Database Design Slide 1
Database Design Slide 1Database Design Slide 1
Database Design Slide 1
 
Introduction to database
Introduction to databaseIntroduction to database
Introduction to database
 
CS101- Introduction to Computing- Lecture 33
CS101- Introduction to Computing- Lecture 33CS101- Introduction to Computing- Lecture 33
CS101- Introduction to Computing- Lecture 33
 
Introduction to microsoft word 2007
Introduction to microsoft word 2007Introduction to microsoft word 2007
Introduction to microsoft word 2007
 
Database management system presentation
Database management system presentationDatabase management system presentation
Database management system presentation
 

Similar to DBIx::Class introduction - 2010

Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodJeremy Kendall
 
Zf Zend Db by aida
Zf Zend Db by aidaZf Zend Db by aida
Zf Zend Db by aidawaraiotoko
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
DBIx-DataModel v2.0 in detail
DBIx-DataModel v2.0 in detail DBIx-DataModel v2.0 in detail
DBIx-DataModel v2.0 in detail Laurent Dami
 
Introduction to DBIx::Lite - Kyoto.pm tech talk #2
Introduction to DBIx::Lite - Kyoto.pm tech talk #2Introduction to DBIx::Lite - Kyoto.pm tech talk #2
Introduction to DBIx::Lite - Kyoto.pm tech talk #2Hiroshi Shibamura
 
Drupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary EditionDrupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary Editionddiers
 
Mongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMetatagg Solutions
 
Tips for using Firebird system tables
Tips for using Firebird system tablesTips for using Firebird system tables
Tips for using Firebird system tablesMind The Firebird
 
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPDifference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPVineet Kumar Saini
 
第49回Php勉強会@関東 Datasource
第49回Php勉強会@関東 Datasource第49回Php勉強会@関東 Datasource
第49回Php勉強会@関東 DatasourceKaz Watanabe
 
Php course-in-navimumbai
Php course-in-navimumbaiPhp course-in-navimumbai
Php course-in-navimumbaivibrantuser
 
Propel sfugmd
Propel sfugmdPropel sfugmd
Propel sfugmdiKlaus
 

Similar to DBIx::Class introduction - 2010 (20)

Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
 
Zf Zend Db by aida
Zf Zend Db by aidaZf Zend Db by aida
Zf Zend Db by aida
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
DBIx-DataModel v2.0 in detail
DBIx-DataModel v2.0 in detail DBIx-DataModel v2.0 in detail
DBIx-DataModel v2.0 in detail
 
Introduction to DBIx::Lite - Kyoto.pm tech talk #2
Introduction to DBIx::Lite - Kyoto.pm tech talk #2Introduction to DBIx::Lite - Kyoto.pm tech talk #2
Introduction to DBIx::Lite - Kyoto.pm tech talk #2
 
DBI
DBIDBI
DBI
 
Drupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary EditionDrupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary Edition
 
PHP API
PHP APIPHP API
PHP API
 
Xpath & xquery
Xpath & xqueryXpath & xquery
Xpath & xquery
 
Mongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg Solutions
 
PHP and Mysql
PHP and MysqlPHP and Mysql
PHP and Mysql
 
php2.pptx
php2.pptxphp2.pptx
php2.pptx
 
Tips for using Firebird system tables
Tips for using Firebird system tablesTips for using Firebird system tables
Tips for using Firebird system tables
 
Drupal 8 database api
Drupal 8 database apiDrupal 8 database api
Drupal 8 database api
 
Php 101: PDO
Php 101: PDOPhp 101: PDO
Php 101: PDO
 
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPDifference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
 
第49回Php勉強会@関東 Datasource
第49回Php勉強会@関東 Datasource第49回Php勉強会@関東 Datasource
第49回Php勉強会@関東 Datasource
 
Php course-in-navimumbai
Php course-in-navimumbaiPhp course-in-navimumbai
Php course-in-navimumbai
 
Introduction to Perl and BioPerl
Introduction to Perl and BioPerlIntroduction to Perl and BioPerl
Introduction to Perl and BioPerl
 
Propel sfugmd
Propel sfugmdPropel sfugmd
Propel sfugmd
 

Recently uploaded

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusZilliz
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbuapidays
 

Recently uploaded (20)

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 

DBIx::Class introduction - 2010