=head1 NAME DBIx::Class::Manual::SchemaIntro - Introduction to DBIx::Class::Schema =head1 INTRODUCTION This document describes how to set up DBIx::Class using the recommended schema-based approach. =head2 Setup First, you should create your base schema class, which inherits from L: package My::Schema; use base qw/DBIx::Class::Schema/; In this class you load your resultsource ("table", "model") classes, which we will define later, using the load_classes() method. You can specify which classes to load manually: # load My::Schema::Album and My::Schema::Artist __PACKAGE__->load_classes(qw/ Album Artist /); Or load classes by namespace: # load My::Schema::Album, My::Schema::Artist and My::OtherSchema::LinerNotes __PACKAGE__->load_classes( { 'My::Schema' => qw/ Album Artist /, 'My::OtherSchema' => qw/ LinerNotes / } ); Or let your schema class load all classes in its namespace automatically: # load My::Schema::* __PACKAGE__->load_classes(); Next, create each of the classes you want to load as specified above: package My::Schema::Album; use base qw/DBIx::Class/; Load any components required by each class with the load_components() method. This should consist of "Core" plus any additional components you want to use. For example, if you use SQLite and want serial/auto-incrementing primary keys: __PACKAGE__->load_components(qw/ PK::Auto::SQLite Core /); C classes exist for many databases; see L for more information. Set the table for your class: __PACKAGE__->table('album'); Add columns to your class: __PACKAGE__->add_columns(qw/ albumid artist title /); Accessors are created for each column automatically, so My::Schema::Album will have albumid(), artist() and title() methods. Define a primary key for your class: __PACKAGE__->set_primary_key('albumid'); If you have a multi-column primary key, just pass a list instead: __PACKAGE__->set_primary_key( qw/ albumid artistid / ); You can define relationships for any of your classes. L will automatically fill in the correct namespace, so if you want to say "a My::Schema::Album object belongs to a My::Schema::Artist object" you do not need to include the namespace when declaring the relationship: __PACKAGE__->belongs_to('artist' => 'Artist'); That's all you need in terms of setup. =head2 Usage In your application code, you should first create a connected schema object: my $schema = My::Schema->connect( $dsn, $user, $password, $attrs ); You can create as many different schema instances as you need. So if you have a second database you want to access: my $other_schema = My::Schema->connect( $dsn, $user, $password, $attrs ); Note that L does not cache connnections for you. If you use multiple connections, you need to do this manually. The simplest way to get a record is by primary key: my $schema = My::Schema->connect( ... ); my $album = $schema->resultset('Album')->find(14); This will run a C