see the manual: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual.pod
package My::Schema; __PACKAGE__->load_namespaces; package My::Schema::Result::Foo; __PACKAGE__->table('foo'); __PACKAGE__->add_columns(qw( foo_id bar baz )); __PACKAGE__->has_many('bars' => 'My::Schema::Result::Bar'); # also belongs_to many_to_many package My::Schema::Result::Bar; __PACKAGE__->table('bar'); # and so on
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );continued...
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );
my $orgs_rs = $schema->resultset('Organism');continued...
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );
my $orgs_rs = $schema->resultset('Organism');
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );
my $orgs_rs = $schema->resultset('Organism');
my $chickeny_things = $orgs_rs->search({ genus => 'Gallus' });continued...
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );
my $orgs_rs = $schema->resultset('Organism');
my $chickeny_things = $orgs_rs->search({ genus => 'Gallus' });
my $schema = My::Schema->connect( 'dbi:Pg:...', $user, $pass );
my $orgs_rs = $schema->resultset('Organism');
my $chickeny_things = $orgs_rs->search({ genus => 'Gallus' });
my $chicken = $chickeny_things->first; #< actual query is run
my $wombat = $orgs_rs->find( 232432 );continued...
my $wombat = $orgs_rs->find( 232432 ); say $wombat->genus.' '.$wombat->species; #< print 'Vombatus ursinus' or something # or search in list context returns all resulting rows my @all_nightshades = $orgs_rs->search({ genus => 'Solanum' });
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' });continued...
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run herecontinued...
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run here my @genes = $chicken->chromosomes->features->search({ type => 'gene' });continued...
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run here my @genes = $chicken->chromosomes->features->search({ type => 'gene' });
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run here my @genes = $chicken->chromosomes->features->search({ type => 'gene' });
$orgs_rs>create({ genus => 'Mus', species => 'musculus' })continued...
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run here my @genes = $chicken->chromosomes->features->search({ type => 'gene' });
$orgs_rs>create({ genus => 'Mus', species => 'musculus' }) # or piecewisecontinued...
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run here my @genes = $chicken->chromosomes->features->search({ type => 'gene' });
$orgs_rs>create({ genus => 'Mus', species => 'musculus' }) # or piecewise my $new = $orgs_rs->new; $new->genus('Mus'); $new->species('musculus'); $new->insert;continued...
my $chickeny_things = $ck_rs->search({ genus => 'Gallus' }); my @chr = $chickeny_things->chromosomes; #< query is run here my @genes = $chicken->chromosomes->features->search({ type => 'gene' });
$orgs_rs>create({ genus => 'Mus', species => 'musculus' }) # or piecewise my $new = $orgs_rs->new; $new->genus('Mus'); $new->species('musculus'); $new->insert;
$chicken->chromosomes->features->search({ type => 'gene' })->delete;
strengths/weaknesses ...
my $styx_tracks = $music_schema->resultset('Artist') ->search({ name => 'Styx' }) ->albums ->tracks; SELECT ... FROM artist JOIN albums ON ... JOIN tracks ON ... WHERE artist.name = 'Styx'
# fetch all my @tracks = $styx_tracks->all; # or iterate while( my $track = $styx_tracks->next ) { ... }
package My::Schema::SummarizedFrobs; __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); __PACKAGE__->result_source_instance->view_definition(<<''); SELECT omg_so_much_stuff UNION SELECT ( SELECT blah blah blah FROM blah ), ( blah blah blah ), WHERE blah blah blah UNION blah blah blah __PACKAGE__->add_column( <cols in your view> )
$schema->resultSet('Sequence::Feature') ->search({ 'me.feature_id' => \[ "IN( select feature_id from clone_feature where clone_id = ?)", [ dummy => $self->clone_id ], ], }, { rows => 10, order_by => [qw[ me.name me.type_id ]], having });
# query will get the wombat organism, and also prefetch *all its # chromosomes and features on those chromosomes* my $rs = $schema->resultset('Organism')->search( { genus => 'Vombatus', species => 'ursinus' }, { prefetch => { chromosomes => features => } }, );
(in a real biological DB this would probably blow your memory)
# get features via the potato organism, also joining in the cvterms table my $potato_bacs = $schema->resultset('Organism') ->search({ species => 'Solanum tuberosum' }) ->search_related( 'features', { 'type.name' => 'BAC_clone'}, { 'join' => 'type' }, );
# the equivalent bare SQL my $potato_bacs = $dbh->selectall_arrayref( <<EOS, undef, 'Solanum tuberosum', 'BAC_clone'); SELECT features.feature_id , features.dbxref_id , features.organism_id , features.name , features.uniquename , features.residues , features.seqlen , features.md5checksum , features.type_id , features.is_analysis , features.is_obsolete , features.timeaccessioned , features.timelastmodified FROM organism me LEFT JOIN feature features ON features.organism_id = me.organism_id JOIN cvterm type ON type.cvterm_id = features.type_id WHERE species = ? AND type.name = ? EOS
$chado->resultset( 'Cv::Cv' ) ->find_or_create({ name => 'My Fake Ontology' }) ->create_related( 'cvterm', { name => 'MyFakeTerm' });
makes the SQL:
SELECT me.cv_id , me.name , me.definition FROM cv me WHERE ( me.name = 'my fake ontology' ) INSERT INTO cv ( name ) VALUES ( 'my fake ontology' ) RETURNING cv_id INSERT INTO cvterm ( cv_id, name ) VALUES ( ?, 'MyFakeTerm' )
$schema->txn_do(sub { $schema->resultset('Cv::Cv') ->find_or_create({ name => 'My Fake Ontology' }) ->create_related( 'cvterm', { name => 'MyFakeTerm' } ); });