Skip to content

Instantly share code, notes, and snippets.

@yoshiki
Created July 29, 2010 08:24
Show Gist options
  • Save yoshiki/497610 to your computer and use it in GitHub Desktop.
Save yoshiki/497610 to your computer and use it in GitHub Desktop.
package Music::DB;
use base qw( Hako );
__PACKAGE__->connection( 'dbi:mysql:dbname', 'username', 'password' );
__PACKAGE__->schema(
artist => {
primary_key => [ qw( id ) ],
columns => [ qw( id name ) ],
},
cd => {
primary_key => [ qw( id ) ],
columns => [ qw( id artist_id title year reldate ) ],
has_a => {
artist_id => 'artist',
},
},
);
# Simply SELECT
my $artists = Music::DB->select( 'artist' );
while ( $artist = $artists->next ) {
print $artist->name, "\n";
}
# If you want array.
my @artists = Music::DB->select( 'artist' );
for my $artist ( @artists ) {
print $artist->name, "\n";
}
# Simply SQL
my $artists = Music::DB->do( 'SELECT * FROM artist WHERE name = ?', 'U2' );
my $artists = Music::DB->do( 'SELECT * FROM artist WHERE name = ? ORDER BY id DESC', 'U2' );
# Create
my $artist = Music::DB->new( 'artist', {
name => 'U2',
} );
$artist->create;
# Update
$artist->name( 'Michael Jackson' );
$artist->update;
# Delete
$artist->delete;
# Relationship
my ( $cd ) = Music::DB->do( 'SELECT * FROM cd WHERE id = ?', 1 );
print $cd->title, "\n";
print $cd->artist->name, "\n";
# Join
my $objs = Music::DB->do( 'SELECT artist.name AS name, cd.title AS title, cd.year AS year FROM artist LEFT JOIN cd ON aritst.id = cd.artist_id' );
while ( my $obj = $objs->next ) {
print $obj->name . ' ' . $obj->title . ' ' . $obj->year, "\n";
}
# Paging
my $artists = Music::DB->select( 'artist', {
page => 1,
per => 10,
} );
My $artists = Music::DB->do( 'SELECT * FROM artist', {
page => 1,
per => 10,
} );
my $pager = $artists->pager; # Data::Page object
# If you want array.
my ( @artists ) = Music::DB->do( 'SELECT * FROM artist', {
page => 1,
per => 10,
} );
my $pager = $artists[0]->pager; # Each object in array has pager method.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment