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



     Leo Lapworth @ LPW 2008

    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
point of note
quot;Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it.quot; - Brian W. Kernighan


   This talk is about making it easy so we you are less
   likely to get confused
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 quot;Tables should not be plural as gives you plurals for Result::
package names which represent a single rowquot; - 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}
       . quot;nquot;;
}
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...

quot;There is more than one way to do it (TIMTOWTDI,
usually pronounced quot;Tim Toadyquot;) is a Perl mottoquot;
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()
       . quot;nquot;;
}
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 models
too much
   typing!

  too much
maintenance!
Schema::Loader



                       Tip


         LPW::DBIC::Result::XX
         LPW::DBIC::ResultSet::XX
splitting logic
      cleanly

LPW::DBIC::Result::XXX     = an individual row

LPW::DBIC::ResultSet::XXX = searches / results
using your Schema
DEBUGGING
DBIC_TRACE=1 ./your_script.pl
Schema::Loader
LPW::DBIC::Result::Authors->table(quot;authorsquot;);
LPW::DBIC::Result::Authors->add_columns(
   quot;idquot;,
   { data_type => quot;INTquot;, default_value => undef,
      is_nullable => 0, size => 8 },
   quot;titlequot;,
   {
      data_type => quot;VARCHARquot;,
      default_value => undef,
      is_nullable => 1,
      size => 255,
   },
);
LPW::DBIC::Result::Authors->set_primary_key(quot;idquot;);
Schema::Loader
LPW::DBIC::Result::Books->table(quot;booksquot;);
LPW::DBIC::Result::Books->add_columns(
   quot;idquot;,
   { data_type => quot;INTquot;, default_value => undef,
      is_nullable => 0, size => 8 },
   quot;namequot;,
   {
      data_type => quot;VARCHARquot;,
      default_value => undef,
      is_nullable => 1,
      size => 255,
   },
   quot;authorquot;,
   { data_type => quot;INTquot;, default_value => undef,
      is_nullable => 1, size => 8 },
);
LPW::DBIC::Result::Books->set_primary_key(quot;idquot;);
Schema::Loader
LPW::DBIC::Result::Authors->has_many(quot;booksquot;, quot;LPW::DBIC::Booksquot;,
{ quot;foreign.authorquot; => quot;self.idquot; });

LPW::DBIC::Result::Books->belongs_to(quot;authorquot;,
quot;LPW::DBIC::Authorsquot;, { id => quot;authorquot; });
Schema::Loader
SQL - debugging

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


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

LPW::DBIC::Result::Books
LPW:: DBIC::ResultSet::Books
LPW:: DBIC::Result::Authors
LPW:: DBIC::ResultSet::Authors
Result::
package LPW::DBIC::Result::Books;
use base 'DBIx::Class';

use strict;
use warnings;

sub isbn {
  my $self = shift;

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

    return $api->isbn();
}

1;
Result::
package LPW::DBIC::Result::Books;
use base 'DBIx::Class';

use strict;
use warnings;

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 LPW::DBIC::Result::Books;
use base 'DBIx::Class';

use strict;
use warnings;
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 LPW::DBIC::Result::Books;
use base 'DBIx::Class';

use strict;
use warnings;
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-11-29
Result:: (inflating)
my $date_published = $book->date_published()
print $date_published->month_abbr();




                Nov
ResultSets::
package LPW::DBIC::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(), } );
}

1;
ResultSets::
package LPW::DBIC::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 LPW::DBIC::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 LPW::DBIC;

my $book_model   = LPW::DBIC->resultset('Books');

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

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

my $book_model   = LPW::DBIC->resultset('Books');
my $author_model = LPW::DBIC->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 ? ) ) ): '5', '%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 LPW::DBIC::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 `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 LPW::DBIC::Result::Books;

__PACKAGE__->has_many(

     quot;author_and_booksquot;,

     quot;LPW::DBIC::Result::AuthorAndBooksquot;,

     { quot;foreign.bookquot; => quot;self.idquot; },


);

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

__PACKAGE__->has_many(

     quot;author_and_booksquot;,
        # Name of accessor
     quot;LPW::DBIC::Result::AuthorAndBooksquot;,
        # Related class
     { quot;foreign.bookquot; => quot;self.idquot; },
        # Relationship (magic often works if not
        # specified, but avoid!)
);
belongs_to
        has_many


Books           Authors_and_Books




        belongs_to
belongs_to
package LPW::DBIC::Result::AuthorAndBooks;


__PACKAGE__->belongs_to(
    quot;bookquot;,
    quot;LPW::DBIC::Result::Booksquot;,
    { id => quot;bookquot; }
);

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


__PACKAGE__->belongs_to(
    quot;bookquot;,                     # Accessor name
    quot;LPW::DBIC::Result::Booksquot;, # Related class
    { id => quot;bookquot; }            # 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 LPW::DBIC::Result::Books;
use base 'DBIx::Class';

__PACKAGE__->many_to_many(
    quot;authorsquot;

        => quot;author_and_booksquot;,

     'author'
);

1;

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

__PACKAGE__->many_to_many(
    quot;authorsquot;
    # Accessor Name
        => quot;author_and_booksquot;,
        # has_many accessor_name
    'author'
    # foreign relationship name
);

1;
many_to_many
package LPW::DBIC::Result::Authors;
use base 'DBIx::Class';

__PACKAGE__->many_to_many(
    quot;booksquot;
    # Accessor Name
        => quot;author_and_booksquot;,
        # 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 LPW::DBIC;

my $author_model = LPW::DBIC->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
'LPW::DBIC::Result::Authors': Can't
locate object method quot;many_to_manyquot; via
package quot;LPW::DBIC::Result::Authorquot; at
lib/LPW/DBIC/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
'LPW::DBIC::Result::Authors': Can't
locate object method quot;many_to_manyquot; via
package quot;LPW::DBIC::Result::Authorquot; at
lib/LPW/DBIC/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::LPW;
use base qw(Catalyst::Model::DBIC::Schema);

use strict;
use warnings;

__PACKAGE__->config(
   schema_class => 'LPW::DBIC',
);

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

use strict;
use warnings;

__PACKAGE__->config(
   schema_class => 'LPW::DBIC',
);

1;



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

     my $model = $c->model('DBIC::LPW');
     my $author_model = $model->resultset('Authors');

}

1;
thanks!


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

More Related Content

What's hot

Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Aaron Gustafson
 
Javascript Module Patterns
Javascript Module PatternsJavascript Module Patterns
Javascript Module PatternsNicholas Jansma
 
Advanced javascript
Advanced javascriptAdvanced javascript
Advanced javascriptDoeun KOCH
 
Class 3 - PHP Functions
Class 3 - PHP FunctionsClass 3 - PHP Functions
Class 3 - PHP FunctionsAhmed Swilam
 
MongoDB Aggregation
MongoDB Aggregation MongoDB Aggregation
MongoDB Aggregation Amit Ghosh
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기JangHyuk You
 
Creating Awesome Web APIs is a Breeze
Creating Awesome Web APIs is a BreezeCreating Awesome Web APIs is a Breeze
Creating Awesome Web APIs is a BreezeMarkus Lanthaler
 
How to Create an Array & types in PHP
How to Create an Array & types in PHP How to Create an Array & types in PHP
How to Create an Array & types in PHP Ajit Sinha
 
MongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB
 
Beginners PHP Tutorial
Beginners PHP TutorialBeginners PHP Tutorial
Beginners PHP Tutorialalexjones89
 
Oracle Collections
Oracle CollectionsOracle Collections
Oracle CollectionsTrendz Lab
 
Introduction To PHP
Introduction To PHPIntroduction To PHP
Introduction To PHPShweta A
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHPBradley Holt
 
Php Using Arrays
Php Using ArraysPhp Using Arrays
Php Using Arraysmussawir20
 
Object Oriented Programming In JavaScript
Object Oriented Programming In JavaScriptObject Oriented Programming In JavaScript
Object Oriented Programming In JavaScriptForziatech
 

What's hot (20)

Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]
 
Javascript Module Patterns
Javascript Module PatternsJavascript Module Patterns
Javascript Module Patterns
 
Arrays in PHP
Arrays in PHPArrays in PHP
Arrays in PHP
 
Advanced javascript
Advanced javascriptAdvanced javascript
Advanced javascript
 
Dive into PySpark
Dive into PySparkDive into PySpark
Dive into PySpark
 
Class 3 - PHP Functions
Class 3 - PHP FunctionsClass 3 - PHP Functions
Class 3 - PHP Functions
 
MongoDB Aggregation
MongoDB Aggregation MongoDB Aggregation
MongoDB Aggregation
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기
 
Creating Awesome Web APIs is a Breeze
Creating Awesome Web APIs is a BreezeCreating Awesome Web APIs is a Breeze
Creating Awesome Web APIs is a Breeze
 
How to Create an Array & types in PHP
How to Create an Array & types in PHP How to Create an Array & types in PHP
How to Create an Array & types in PHP
 
Php
PhpPhp
Php
 
MongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDB
 
Beginners PHP Tutorial
Beginners PHP TutorialBeginners PHP Tutorial
Beginners PHP Tutorial
 
Oracle Collections
Oracle CollectionsOracle Collections
Oracle Collections
 
Introduction To PHP
Introduction To PHPIntroduction To PHP
Introduction To PHP
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
Php Using Arrays
Php Using ArraysPhp Using Arrays
Php Using Arrays
 
Data Types In PHP
Data Types In PHPData Types In PHP
Data Types In PHP
 
php
phpphp
php
 
Object Oriented Programming In JavaScript
Object Oriented Programming In JavaScriptObject Oriented Programming In JavaScript
Object Oriented Programming In JavaScript
 

Similar to DBIx::Class beginners

DBIx::Class introduction - 2010
DBIx::Class introduction - 2010DBIx::Class introduction - 2010
DBIx::Class introduction - 2010leo lapworth
 
Introduction To Moco
Introduction To MocoIntroduction To Moco
Introduction To MocoNaoya Ito
 
Rapid Prototyping with PEAR
Rapid Prototyping with PEARRapid Prototyping with PEAR
Rapid Prototyping with PEARMarkus Wolff
 
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
 
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
 
Php Data Objects
Php Data ObjectsPhp Data Objects
Php Data Objectshiren.joshi
 
Introduction to couch_db
Introduction to couch_dbIntroduction to couch_db
Introduction to couch_dbRomain Testard
 
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 & Perl6Workhorse Computing
 
Into to DBI with DBD::Oracle
Into to DBI with DBD::OracleInto to DBI with DBD::Oracle
Into to DBI with DBD::Oraclebyterock
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 
Drupal Development (Part 2)
Drupal Development (Part 2)Drupal Development (Part 2)
Drupal Development (Part 2)Jeff Eaton
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation FrameworkCaserta
 
P H P Part I I, By Kian
P H P  Part  I I,  By  KianP H P  Part  I I,  By  Kian
P H P Part I I, By Kianphelios
 
Intro to #memtech PHP 2011-12-05
Intro to #memtech PHP   2011-12-05Intro to #memtech PHP   2011-12-05
Intro to #memtech PHP 2011-12-05Jeremy Kendall
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in PerlLaurent Dami
 
DBIx::Skinnyと仲間たち
DBIx::Skinnyと仲間たちDBIx::Skinnyと仲間たち
DBIx::Skinnyと仲間たちRyo Miyake
 
Iterators & generators: practical uses in memory management
Iterators & generators: practical uses in memory managementIterators & generators: practical uses in memory management
Iterators & generators: practical uses in memory managementAdrian Cardenas
 

Similar to DBIx::Class beginners (20)

DBIx::Class introduction - 2010
DBIx::Class introduction - 2010DBIx::Class introduction - 2010
DBIx::Class introduction - 2010
 
Introduction To Moco
Introduction To MocoIntroduction To Moco
Introduction To Moco
 
Rapid Prototyping with PEAR
Rapid Prototyping with PEARRapid Prototyping with PEAR
Rapid Prototyping with PEAR
 
DBIx-DataModel v2.0 in detail
DBIx-DataModel v2.0 in detail DBIx-DataModel v2.0 in detail
DBIx-DataModel v2.0 in detail
 
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
 
Php Data Objects
Php Data ObjectsPhp Data Objects
Php Data Objects
 
Introduction to couch_db
Introduction to couch_dbIntroduction to couch_db
Introduction to couch_db
 
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
 
Into to DBI with DBD::Oracle
Into to DBI with DBD::OracleInto to DBI with DBD::Oracle
Into to DBI with DBD::Oracle
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Drupal Development (Part 2)
Drupal Development (Part 2)Drupal Development (Part 2)
Drupal Development (Part 2)
 
Framework
FrameworkFramework
Framework
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation Framework
 
P H P Part I I, By Kian
P H P  Part  I I,  By  KianP H P  Part  I I,  By  Kian
P H P Part I I, By Kian
 
DBI
DBIDBI
DBI
 
Intro to #memtech PHP 2011-12-05
Intro to #memtech PHP   2011-12-05Intro to #memtech PHP   2011-12-05
Intro to #memtech PHP 2011-12-05
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
 
PHP POWERPOINT SLIDES
PHP POWERPOINT SLIDESPHP POWERPOINT SLIDES
PHP POWERPOINT SLIDES
 
DBIx::Skinnyと仲間たち
DBIx::Skinnyと仲間たちDBIx::Skinnyと仲間たち
DBIx::Skinnyと仲間たち
 
Iterators & generators: practical uses in memory management
Iterators & generators: practical uses in memory managementIterators & generators: practical uses in memory management
Iterators & generators: practical uses in memory management
 

Recently uploaded

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 

Recently uploaded (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 

DBIx::Class beginners