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 here
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' });
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 piecewise
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;
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' } );
});