Nuked
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Manual / Intro.pod
CommitLineData
9c82c181 1=head1 NAME
2
3b44ccc6 3DBIx::Class::Manual::Intro - Introduction to DBIx::Class
9c82c181 4
40dbc108 5=head1 INTRODUCTION
076652e8 6
40dbc108 7So, you are bored with SQL, and want a native Perl interface for your
8database? Or you've been doing this for a while with L<Class::DBI>,
35d4fe78 9and think there's a better way? You've come to the right place.
10Let's look at how you can set and use your first native L<DBIx::Class>
11tree.
076652e8 12
35d4fe78 13First we'll see how you can set up your classes yourself. If you want
40dbc108 14them to be auto-discovered, just skip to the next section, which shows
5cc9fa32 15you how to use L<DBIx::Class::Schema::Loader>.
076652e8 16
17=head2 Setting it up manually
18
5cc9fa32 19First, you should create your base schema class, which inherits from
20L<DBIx::Class::Schema>:
076652e8 21
5cc9fa32 22 package My::Schema;
23 use base qw/DBIx::Class::Schema/;
24
25In this class you load your result_source ("table", "model") classes, which
26we will define later, using the load_classes() method. You can specify which
27classes to load manually:
076652e8 28
5cc9fa32 29 # load My::Schema::Album and My::Schema::Artist
30 __PACKAGE__->load_classes(qw/ Album Artist /);
076652e8 31
5cc9fa32 32Or load classes by namespace:
076652e8 33
5cc9fa32 34 # load My::Schema::Album, My::Schema::Artist and My::OtherSchema::LinerNotes
35 __PACKAGE__->load_classes(
36 {
37 'My::Schema' => [qw/ Album Artist /],
38 'My::OtherSchema' => [qw/ LinerNotes /]
39 }
40 );
41
42Or let your schema class load all classes in its namespace automatically:
076652e8 43
5cc9fa32 44 # load My::Schema::*
45 __PACKAGE__->load_classes();
076652e8 46
5cc9fa32 47Next, create each of the classes you want to load as specified above:
076652e8 48
5cc9fa32 49 package My::Schema::Album;
50 use base qw/DBIx::Class/;
35d4fe78 51
5cc9fa32 52Load any components required by each class with the load_components() method.
53This should consist of "Core" plus any additional components you want to use.
54For example, if you want serial/auto-incrementing primary keys:
076652e8 55
5cc9fa32 56 __PACKAGE__->load_components(qw/ PK::Auto Core /);
076652e8 57
5cc9fa32 58C<PK::Auto> is supported for many databases; see
59L<DBIx::Class::Storage::DBI> for more information.
076652e8 60
5cc9fa32 61Set the table for your class:
076652e8 62
35d4fe78 63 __PACKAGE__->table('album');
076652e8 64
5cc9fa32 65Add columns to your class:
66
67 __PACKAGE__->add_columns(qw/ albumid artist title /);
68
69Each column can also be set up with its own accessor, data_type and other
70pieces of information that it may be useful to have, just pass C<add_columns>
71a hash such as:
72
73 __PACKAGE__->add_columns(albumid =>
74 { accessor => 'album',
75 data_type => 'integer',
76 size => 16,
77 is_nullable => 0,
78 is_auto_increment => 1,
79 default_value => '',
80 },
81 artist =>
82 { data_type => 'integer',
83 size => 16,
84 is_nullable => 0,
85 is_auto_increment => 0,
86 default_value => '',
87 },
88 title =>
89 { data_type => 'varchar',
90 size => 256,
91 is_nullable => 0,
92 is_auto_increment => 0,
93 default_value => '',
94 }
95 );
96
97Most of this data isn't yet used directly by DBIx::Class, but various related
98modules such as L<DBIx::Class::WebForm> make use of it. Also it allows you
99to create your database tables from your Schema, instead of the other way
100around. See L<SQL::Translator> for details.
101
102See L<DBIx::Class::ResultSource> for more details of the possible column
103attributes.
104
105Accessors are created for each column automatically, so My::Schema::Album will
106have albumid() (or album(), when using the accessor), artist() and title()
107methods.
108
109Define a primary key for your class:
076652e8 110
5cc9fa32 111 __PACKAGE__->set_primary_key('albumid');
076652e8 112
5cc9fa32 113If you have a multi-column primary key, just pass a list instead:
076652e8 114
5cc9fa32 115 __PACKAGE__->set_primary_key( qw/ albumid artistid / );
076652e8 116
5cc9fa32 117Define relationships that the class has with any other classes by using
118either C<belongs_to> to describe a column which contains an ID of another
119table, or C<has_many> to make a predefined accessor for fetching objects
120that contain this tables foreign key in one of their columns:
121
122 __PACKAGE__->has_many('albums', 'My::Schema::Artist', 'album_id');
076652e8 123
5cc9fa32 124More information about the various types of relationships available, and
125how you can design your own, can be found in L<DBIx::Class::Relationship>.
076652e8 126
076652e8 127
5cc9fa32 128=head2 Using L<DBIx::Class::Schema::Loader>
076652e8 129
5cc9fa32 130This is an external module, and not part of the L<DBIx::Class>
40dbc108 131distribution. Like L<Class::DBI::Loader>, it inspects your database,
35d4fe78 132and automatically creates classes for all the tables in your database.
133Here's a simple setup:
076652e8 134
35d4fe78 135 package MyApp::DB;
5cc9fa32 136 use DBIx::Class::Schema::Loader;
40dbc108 137
35d4fe78 138 my $loader = DBIx::Class::Loader->new(
139 dsn => 'dbi:SQLite:/home/me/myapp/my.db',
140 namespace => 'MyApp::DB'
141 );
076652e8 142
35d4fe78 143 1;
076652e8 144
35d4fe78 145This should be equivalent to the manual setup in the section above.
5cc9fa32 146L<DBIx::Class::Schema::Loader> takes lots of other options. For more
40dbc108 147information, consult its documentation.
076652e8 148
5cc9fa32 149=head2 Connecting
150
151L<DBIx::Class::Schema::Loader> already contains the connection info for the
152database, so to get started all you need to do is create an instance of your
153class:
154
155 my $schema = MyApp::DB->new();
156
157To connect to your manually created Schema, you also need to provide the
158connection details:
159
160 my $schema = My::Schema->connect('dbi:SQLite:/home/me/myapp/my.db');
161
162You can create as many different schema instances as you need. So if you have
163a second database you want to access:
164
165 my $other_schema = My::Schema->connect( $dsn, $user, $password, $attrs );
166
167Note that L<DBIx::Class::Schema> does not cache connnections for you. If you
168use multiple connections, you need to do this manually.
169
170To execute some sql statements on every connect you can pass them to your schema after the connect:
171
172 $schema->storage->on_connect_do(\@on_connect_sql_statments);
173
40dbc108 174=head2 Basic usage
076652e8 175
35d4fe78 176Once you've defined the basic classes, either manually or using
5cc9fa32 177L<DBIx::Class::Schema::Loader>, you can start interacting with your database.
178
179To access your database using your $schema object, you can fetch a L<DBIx::Class::Manual::Glossary/"ResultSet">
180representing each of your tables by calling the ->resultset method.
181
35d4fe78 182The simplest way to get a record is by primary key:
076652e8 183
5cc9fa32 184 my $album = $schema->resultset('Album')->find(14);
076652e8 185
35d4fe78 186This will run a C<SELECT> with C<albumid = 14> in the C<WHERE> clause,
187and return an instance of C<MyApp::DB::Album> that represents this
188row. Once you have that row, you can access and update columns:
076652e8 189
35d4fe78 190 $album->title('Physical Graffiti');
191 my $title = $album->title; # $title holds 'Physical Graffiti'
076652e8 192
40dbc108 193If you prefer, you can use the C<set_column> and C<get_column>
194accessors instead:
076652e8 195
35d4fe78 196 $album->set_column('title', 'Presence');
197 $title = $album->get_column('title');
076652e8 198
5cc9fa32 199Just like with L<Class::DBI>, you call C<update> to commit your
40dbc108 200changes to the database:
201
35d4fe78 202 $album->update;
076652e8 203
35d4fe78 204If needed, you can throw away your local changes like this:
076652e8 205
35d4fe78 206 $album->discard_changes if $album->is_changed;
076652e8 207
40dbc108 208As you can see, C<is_changed> allows you to check if there are local
209changes to your object.
076652e8 210
40dbc108 211=head2 Adding and removing rows
076652e8 212
40dbc108 213To create a new record in the database, you can use the C<create>
35d4fe78 214method. It returns an instance of C<MyApp::DB::Album> that can be
215used to access the data in the new record:
076652e8 216
5cc9fa32 217 my $new_album = $schema->resultset('Album')->create({
35d4fe78 218 title => 'Wish You Were Here',
219 artist => 'Pink Floyd'
220 });
dfeba824 221
222Now you can add data to the new record:
223
35d4fe78 224 $new_album->label('Capitol');
225 $new_album->year('1975');
226 $new_album->update;
076652e8 227
35d4fe78 228Likewise, you can remove it from the database like this:
076652e8 229
35d4fe78 230 $new_album->delete;
076652e8 231
5cc9fa32 232You can also remove records without retrieving them first, by calling
233delete directly on a ResultSet object.
076652e8 234
35d4fe78 235 # Delete all of Falco's albums
5cc9fa32 236 $schema->resultset('Album')->search({ artist => 'Falco' })->delete;
076652e8 237
40dbc108 238=head2 Finding your objects
076652e8 239
40dbc108 240L<DBIx::Class> provides a few different ways to retrieve data from
35d4fe78 241your database. Here's one example:
242
243 # Find all of Santana's albums
5cc9fa32 244 my $rs = $schema->resultset('Album')->search({ artist => 'Santana' });
35d4fe78 245
246In scalar context, as above, C<search> returns a
247L<DBIx::Class::ResultSet> object. It can be used to peek at the first
248album returned by the database:
249
250 my $album = $rs->first;
251 print $album->title;
076652e8 252
5cc9fa32 253You can loop over the albums and update each one:
076652e8 254
35d4fe78 255 while (my $album = $rs->next) {
256 print $album->artist . ' - ' . $album->title;
257 $album->year(2001);
258 $album->update;
259 }
a3c5e7e3 260
5cc9fa32 261Or, you can update them all at once:
262
263 $rs->update({ year => 2001 });
264
35d4fe78 265For more information on what you can do with a
266L<DBIx::Class::ResultSet>, see L<DBIx::Class::ResultSet/METHODS>.
a3c5e7e3 267
35d4fe78 268In list context, the C<search> method returns all of the matching
a3c5e7e3 269rows:
270
35d4fe78 271 # Fetch immediately all of Carlos Santana's albums
5cc9fa32 272 my @albums = $schema->resultset('Album')->search(
273 { artist => 'Carlos Santana' }
274 );
35d4fe78 275 foreach my $album (@albums) {
276 print $album->artist . ' - ' . $album->title;
277 }
076652e8 278
40dbc108 279We also provide a handy shortcut for doing a C<LIKE> search:
076652e8 280
35d4fe78 281 # Find albums whose artist starts with 'Jimi'
282 my $rs = MyApp::DB::Album->search_like({ artist => 'Jimi%' });
076652e8 283
5cc9fa32 284Or you can provide your own C<WHERE> clause, like:
35d4fe78 285
286 # Find Peter Frampton albums from the year 1986
287 my $where = 'artist = ? AND year = ?';
288 my @bind = ( 'Peter Frampton', 1986 );
5cc9fa32 289 my $rs = $schema->resultset('Album')->search_literal( $where, @bind );
40dbc108 290
291The preferred way to generate complex queries is to provide a
292L<SQL::Abstract> construct to C<search>:
293
5cc9fa32 294 my $rs = $schema->resultset('Album')->search({
35d4fe78 295 artist => { '!=', 'Janis Joplin' },
296 year => { '<' => 1980 },
297 albumid => [ 1, 14, 15, 65, 43 ]
298 });
299
300This results in something like the following C<WHERE> clause:
40dbc108 301
35d4fe78 302 WHERE artist != 'Janis Joplin'
303 AND year < 1980
304 AND albumid IN (1, 14, 15, 65, 43)
305
306For more examples of complex queries, see
40dbc108 307L<DBIx::Class::Manual::Cookbook>.
308
309The search can also be modified by passing another hash with
310attributes:
311
35d4fe78 312 my @albums = MyApp::DB::Album->search(
313 { artist => 'Bob Marley' },
314 { rows => 2, order_by => 'year DESC' }
315 );
316
317C<@albums> then holds the two most recent Bob Marley albums.
40dbc108 318
319For a complete overview of the available attributes, see
320L<DBIx::Class::ResultSet/ATTRIBUTES>.
076652e8 321
40dbc108 322=head1 SEE ALSO
076652e8 323
40dbc108 324=over 4
076652e8 325
40dbc108 326=item * L<DBIx::Class::Manual::Cookbook>
076652e8 327
40dbc108 328=item * L<DBIx::Class::Manual::FAQ>
076652e8 329
40dbc108 330=back
076652e8 331
332=cut