dbix::class walkthrough @ bangalore pm

23
+ In this presentation I will walk through DBIx::Class which helps you get started DBIX::CLASS WALK THROUGH

Upload: sheeju-alex

Post on 05-Dec-2014

761 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

+ In this presentation I will walk through DBIx::Class which helps you get started

DBIX::CLASS

WALK THROUGH

~ Sheeju Alex ~

DBI BACKGROUND

+ Perl Database Interface Module + High level layer to interact with databases

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)

+ User Role Mangement Example

DBIX EXAMPLE: GENERATE SCHEMA

+ 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);

DBIX EXAMPLE: METHODS YOU LIKE

+ find_or_create + update_or_create + $schema->deploy

RESULT VS RESULTSET

+ Result = Row + ResultSet = Query Plan ($user->active)

Sheeju Alex

THANKS!Happy Coding :)

Exceleron Inc Lead Product Developer [email protected]