Date post: | 05-Dec-2014 |
Category: |
Technology |
Upload: | sheeju-alex |
View: | 761 times |
Download: | 3 times |
+ In this presentation I will walk through DBIx::Class which helps you get started
DBIX::CLASS
WALK THROUGH
DBI BACKGROUND
+ Awesome module which can connect to any database youask
+ Uniform interface to handle different types of databases
+ Is an ORM (Object Relational Mapper) + SQL => Object
DBIX::CLASS
+ Database tables becomes Object + Table data and relationships between tables become object
methods
+ Alternatives?
DBIX::CLASS
+ DBIx::Class or Rose::DB::Object (Perl) + Hibernate (Java)
+ Yii/Zend (PHP)
+ Founded by Matt S. Trout (mst) + Website:
DBIX::CLASS
http://www.dbix-class.org/
+ Benefits?
DBIX::CLASS
+ No more writing SQL + Make your coding easier
+ Cross DB: Majority of code should run on all databases + SQL statements are executed when it is needed (perfoma)
+ dbicdump
DBIX EXAMPLE: GENERATE SCHEMA
dbicdump -o dump_directory=./lib DBIxTest::Schema dbi:Pg:dbname=dbix_test sheeju "{quote_char=>q{\"}, quote_field_names=>{0}, name_sep=>{.} }"
+ make_schema_at using simple perl script
DBIX EXAMPLE: GENERATE SCHEMA
#!/usr/bin/env perl
use FindBin;use Getopt::Std;use Data::Dumper;
use lib "$FindBin::Bin/../lib";
use DBIx::Class::Schema::Loader 'make_schema_at';
our ($opt_F, $opt_d);getopts('Fd');
make_schema_at('DBIxTest::Schema', { debug => !!($opt_d), really_erase_my_files => !!($opt_F), dump_directory=>"$FindBin::Bin/lib", overwrite_modifications=>1, preserve_case=>1, }, ['dbi:Pg:dbname=dbix_test','sheeju','sheeju', {'quote_char' => '"', 'quote_field_names' => '0', 'name_sep' ], );
+ DBIxTest/Schema.pm
DBIX EXAMPLE: GENERATE SCHEMA
use utf8;package DBIxTest::Schema;
# Created by DBIx::Class::Schema::Loader# DO NOT MODIFY THE FIRST PART OF THIS FILE
use strict;use warnings;
use base 'DBIx::Class::Schema';
__PACKAGE__->load_namespaces;1;
+ Result/User.pm (User Object or User Table)
DBIX EXAMPLE: GENERATE SCHEMA
package DBIxTest::Schema::Result::User;use base 'DBIx::Class::Core';
__PACKAGE__->table("User");
__PACKAGE__->add_columns( "Id", { accessor => "id", data_type => "integer", is_auto_increment => 1, is_nullable => 0, sequence => "User_Id_seq", }, "Name", { accessor => "name", data_type => "varchar", is_nullable => 0, size => 255 }, "Email", { accessor => "email", data_type => "varchar", is_nullable => 0, size => 255 }, "PasswordSalt", { accessor => "password_salt", data_type => "bytea", is_nullable => 0 }, "PasswordHash", { accessor => "password_hash", data_type => "bytea", is_nullable => 0 }, "Status", { accessor => "status", data_type => "varchar", default_value => "Active", is_nullable => 0, size => 64 },);
__PACKAGE__->set_primary_key("Id");
__PACKAGE__->add_unique_constraint("User_Email_key", ["Email"]);
__PACKAGE__->has_many( "user_roles", "DBIxTest::Schema::Result::UserRole", { "foreign.UserId" => "self.Id" },);
__PACKAGE__->many_to_many("roles", "user_roles", "role");
+ Result/Role.pm
DBIX EXAMPLE: GENERATE SCHEMA
package DBIxTest::Schema::Result::Role;
use strict;use warnings;
use base 'DBIx::Class::Core';
__PACKAGE__->table("Role");
__PACKAGE__->add_columns( "Id", { accessor => "id", data_type => "integer", is_auto_increment => 1, is_nullable => 0, sequence => "Role_Id_seq", }, "Name", { accessor => "name", data_type => "varchar", is_nullable => 0, size => 255 },);
__PACKAGE__->set_primary_key("Id");
__PACKAGE__->has_many( "user_roles", "DBIxTest::Schema::Result::UserRole", { "foreign.RoleId" => "self.Id" },
+ Result/UserRole.pm
DBIX EXAMPLE: GENERATE SCHEMA
package DBIxTest::Schema::Result::UserRole;
use strict;use warnings;
use base 'DBIx::Class::Core';
__PACKAGE__->table("UserRole");
__PACKAGE__->add_columns( "UserId", { accessor => "user_id", data_type => "integer", is_foreign_key => 1, is_nullable => }, "RoleId", { accessor => "role_id", data_type => "integer", is_foreign_key => 1, is_nullable => },);
__PACKAGE__->set_primary_key("UserId", "RoleId");
__PACKAGE__->belongs_to( "role", "DBIxTest::Schema::Result::Role",
+ Schema creations
DBIX EXAMPLE: SCHEMA
use DBIxTest::Schema;
my $schema = DBIxTest::Schema->connect( "DBI:Pg:dbname=dbix_test", "sheeju", "sheeju", { RaiseError => 1, PrintError => 1, 'quote_char' => '"', 'quote_field_names'
+ C: Create
DBIX EXAMPLE: CRUD
+ Create/Insert Record
my $user_01 = $schema->resultset('User')->create( { Name => 'JohnSample', Email => '[email protected]', PasswordSalt => 'sheeju', PasswordHash => 'sheeju', Status => 'Active', } );
+ R: Read
DBIX EXAMPLE: CRUD
+ Read All records
my $all_users = $schema->resultset('User')->all;
+ Select/search query$active_users = $schema->resultset('User')->search({"Status" => "Active"});
+ JOIN and Search query
$active_users = $schema->resultset('User')->search( {"user_roles.RoleId" => 1}, {"join" => "user_roles"});
+ U: Update
DBIX EXAMPLE: CRUD
+ Update User Email
$user_01->update({Email => '[email protected]'});
+ Update with Join
$active_users = $schema->resultset('User')->search( {"user_roles.RoleId" => 1}, {"join" => "user_roles"});$active_users->update({Status => 'InActive'});
+ D: Delete
DBIX EXAMPLE: CRUD
+ Delete Record$user_01->delete;
my $user = $schema->resultset('User')->search( { Email => '[email protected]' } )->first;$user->delete if($user);