NAME
DBIx::Custom - DBI interface, having hash parameter binding and filtering system
STABILITY
This module is not stable. Method name and implementations will be changed for a while.
SYNOPSYS
Connect to the database.
use DBIx::Custom;
my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=books",
user => 'ken', password => '!LFKD%$&');
Insert, update, and delete
# Insert
$dbi->insert(table => 'books',
param => {title => 'perl', author => 'Ken'},
filter => {title => 'encode_utf8'});
# Update
$dbi->update(table => 'books',
param => {title => 'aaa', author => 'Ken'},
where => {id => 5},
filter => {title => 'encode_utf8'});
# Update all
$dbi->update_all(table => 'books',
param => {title => 'aaa'},
filter => {title => 'encode_utf8'});
# Delete
$dbi->delete(table => 'books',
where => {author => 'Ken'},
filter => {title => 'encode_utf8'});
# Delete all
$dbi->delete_all(table => 'books');
Select
# Select
my $result = $dbi->select(table => 'books');
# Select, more complex
my $result = $dbi->select(
table => 'books',
column => [qw/author title/],
where => {author => 'Ken'},
append => 'order by id limit 1',
filter => {title => 'encode_utf8'}
);
# Select, join table
my $result = $dbi->select(
table => ['books', 'rental'],
column => ['books.name as book_name']
relation => {'books.id' => 'rental.book_id'}
);
Execute SQL
# Execute SQL
$dbi->execute("select title from books");
# Execute SQL with hash binding and filtering
$dbi->execute("select id from books where {= author} && {like title}",
param => {author => 'ken', title => '%Perl%'},
filter => {title => 'encode_utf8'});
# Create query and execute it
my $query = $dbi->create_query(
"select id from books where {= author} && {like title}"
);
$dbi->execute($query, param => {author => 'ken', title => '%Perl%'})
More features.
# Default filter
$dbi->default_bind_filter('encode_utf8');
$dbi->default_fetch_filter('decode_utf8');
# Get DBI object
my $dbh = $dbi->dbh;
Fetch row.
# Fetch
while (my $row = $result->fetch) {
# ...
}
# Fetch hash
while (my $row = $result->fetch_hash) {
}
DESCRIPTION
1. Features
DBIx::Custom is one of DBI interface modules, such as DBIx::Class, DBIx::Simple.
This module is not O/R mapper. O/R mapper is useful, but you must learn many syntax of the O/R mapper, which is almost another language Create SQL statement is offten not effcient and damage SQL performance. so you have to execute raw SQL in the end.
DBIx::Custom is middle area between DBI and O/R mapper. DBIx::Custom provide flexible hash parameter binding adn filtering system, and suger method, such as select()
, update()
, delete()
, select()
to execute a query easily.
DBIx::Custom respects SQL. SQL is not beautiful, but de-facto standard, so all people learing database system know it. If you know SQL statement, you learn a little thing about DBIx::Custom to do your works.
2. Basic usage
connect to the database
connect()
method create a new DBIx::Custom object and connect to the database.
use DBIx::Custom;
my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=books",
user => 'ken', password => '!LFKD%$&');
Suger methods
DBIx::Custom has suger methods, such as insert()
, update()
, delete()
and select()
. If you want to do simple works, You don't have to create SQL statement.
Execute insert statement:
$dbi->insert(table => 'books',
param => {title => 'perl', author => 'Ken'});
The following SQL is executed.
insert into (title, author) values (?, ?)
The values of title
and author
is embedded into placeholders.
Execute update statement:
$dbi->update(table => 'books',
param => {title => 'aaa', author => 'Ken'},
where => {id => 5});
The following SQL is executed.
update books set title = ?, author = ?;
The values of title
and author
is embedded into placeholders.
If you want to update all rows, use update_all()
method instead.
Execute delete statement:
$dbi->delete(table => 'books',
where => {author => 'Ken'});
The following SQL is executed.
delete from books where id = ?;
The value of id
is embedded into a placehodler.
If you want to delete all rows, use delete_all()
method instead.
Execute select statement:
Specify only table:
my $result = $dbi->select(table => 'books');
The following SQL is executed.
select * from books;
the result of select()
method is DBIx::Custom::Result object. use fetch()
method to fetch a row.
while (my $row = $result->fetch) {
my $title = $row->[0];
my $author = $row->[1];
}
DBIx::Custom::Result has various methods to fetch row. See "2. Result of select statement".
Specify column
and where
arguments:
my $result = $dbi->select(
table => 'books',
column => [qw/author title/],
where => {author => 'Ken'});
The following SQL is executed.
select author, title from books where author = ?;
the value of author
is embdded into placeholder.
If relation
argument is specifed, you can join tables.
my $result = $dbi->select(
table => ['books', 'rental'],
column => ['books.name as book_name']
relation => {'books.id' => 'rental.book_id'}
);
The following SQL is executed.
select books.name as book_name from books
where books.id = rental.book_id;
ATTRIBUTES
user
my $user = $dbi->user;
$dbi = $dbi->user('Ken');
User name. connect()
method use this value to connect the database.
password
my $password = $dbi->password;
$dbi = $dbi->password('lkj&le`@s');
Password. connect()
method use this value to connect the database.
data_source
my $data_source = $dbi->data_source;
$dbi = $dbi->data_source("DBI:mysql:database=dbname");
Data source. connect()
method use this value to connect the database.
dbh
my $dbh = $dbi->dbh;
$dbi = $dbi->dbh($dbh);
DBI object. You can call all methods of DBI.
filters
my $filters = $dbi->filters;
$dbi = $dbi->filters(\%filters);
Filter functions. "encode_utf8" and "decode_utf8" is registered by default.
default_bind_filter
my $default_bind_filter = $dbi->default_bind_filter
$dbi = $dbi->default_bind_filter('encode_utf8');
Default filter when parameter binding is executed.
default_fetch_filter
my $default_fetch_filter = $dbi->default_fetch_filter;
$dbi = $dbi->default_fetch_filter('decode_utf8');
Default filter when row is fetched.
result_class
my $result_class = $dbi->result_class;
$dbi = $dbi->result_class('DBIx::Custom::Result');
Result class for select statement. Default to DBIx::Custom::Result.
sql_builder
my $sql_class = $dbi->sql_builder;
$dbi = $dbi->sql_builder(DBIx::Custom::QueryBuilder->new);
SQL builder. sql_builder must be the instance of DBIx::Custom::QueryBuilder subclass. Default to DBIx::Custom::QueryBuilder object.
cache
my $cache = $dbi->cache;
$dbi = $dbi->cache(1);
Enable parsed DBIx::Custom::Query object caching. Default to 1.
cache_method
$dbi = $dbi->cache_method(\&cache_method);
$cache_method = $dbi->cache_method
Method to set and get caches.
Example:
$dbi->cache_method(
sub {
my $self = shift;
$self->{_cached} ||= {};
if (@_ > 1) {
$self->{_cached}{$_[0]} = $_[1]
}
else {
return $self->{_cached}{$_[0]}
}
}
);
METHODS
DBIx::Custom inherits all methods from Object::Simple and implements the following new ones.
connect
my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname",
user => 'ken', password => '!LFKD%$&');
Create a new DBIx::Custom object and connect to the database. DBIx::Custom is a wrapper of DBI. AutoCommit
and RaiseError
option is true, and PrintError
option is false by default.
insert
$dbi->insert(table => $table,
param => \%param,
append => $append,
filter => \%filter);
Execute insert statement. insert
method have table
, param
, append
and filter
arguments. table
is a table name. param
is column-value pairs. this must be hash reference. append
is a string added at the end of the SQL statement. filter
is filters when parameter binding is executed. This is overwrites default_bind_filter
. Return value of insert
is the count of affected rows.
Example:
$dbi->insert(table => 'books',
param => {title => 'Perl', author => 'Taro'},
append => "some statement",
filter => {title => 'encode_utf8'})
update
$dbi->update(table => $table,
param => \%params,
where => \%where,
append => $append,
filter => \%filter)
Execute update statement. update
method have table
, param
, where
, append
and filter
arguments. table
is a table name. param
is column-value pairs. this must be hash reference. where
is where clause. this must be hash reference. append
is a string added at the end of the SQL statement. filter
is filters when parameter binding is executed. This is overwrites default_bind_filter
. Return value of update
is the count of affected rows.
Example:
$dbi->update(table => 'books',
param => {title => 'Perl', author => 'Taro'},
where => {id => 5},
append => "for update",
filter => {title => 'encode_utf8'});
update_all
$dbi->update_all(table => $table,
param => \%params,
filter => \%filter,
append => $append);
Execute update statement to update all rows. Arguments is same as update
method, except that update_all
don't have where
argument. Return value of update_all
is the count of affected rows.
Example:
$dbi->update_all(table => 'books',
param => {author => 'taro'},
filter => {author => 'encode_utf8'});
delete
$dbi->delete(table => $table,
where => \%where,
append => $append,
filter => \%filter);
Execute delete statement. delete
method have table
, where
, append
, and filter
arguments. table
is a table name. where
is where clause. this must be hash reference. append
is a string added at the end of the SQL statement. filter
is filters when parameter binding is executed. Return value of delete
is the count of affected rows.
Example:
$dbi->delete(table => 'books',
where => {id => 5},
append => 'some statement',
filter => {id => 'encode_utf8'});
delete_all
$dbi->delete_all(table => $table);
Execute delete statement to delete all rows. Arguments is same as delete
method, except that delete_all
don't have where
argument. Return value of delete_all
is the count of affected rows.
Example:
$dbi->delete_all(table => 'books');
select
my $result = $dbi->select(table => $table,
column => [@column],
where => \%where,
append => $append,
relation => \%relation,
filter => \%filter);
Execute select statement. select
method have table
, column
, where
, append
relation
and filter
arguments. table
is a table name. where
is where clause. this must be hash reference or a string containing such tags as "{= title} or {= author}". append
is a string added at the end of the SQL statement. filter
is filters when parameter binding is executed.
Example:
# select * from books;
my $result = $dbi->select(table => 'books');
# select * from books where title = ?;
my $result = $dbi->select(table => 'books', where => {title => 'Perl'});
# select title, author from books where id = ? for update;
my $result = $dbi->select(
table => 'books',
column => ['title', 'author'],
where => {id => 1},
appned => 'for update'
);
# select books.name as book_name from books, rental
# where books.id = rental.book_id;
my $result = $dbi->select(
table => ['books', 'rental'],
column => ['books.name as book_name']
relation => {'books.id' => 'rental.book_id'}
);
create_query
my $query = $dbi->create_query(
"select * from authors where {= name} and {= age};"
);
Create the instance of DBIx::Custom::Query from SQL source.
execute
my $result = $dbi->execute($query, param => $params, filter => \%filter);
my $result = $dbi->execute($source, param => $params, filter => \%filter);
Execute query or SQL source. Query is DBIx::Csutom::Query object. Return value is DBIx::Custom::Result in select statement, or the count of affected rows in insert, update, delete statement.
Example:
my $result = $dbi->execute("select * from authors where {= name} and {= age}",
param => {name => 'taro', age => 19});
while (my $row = $result->fetch) {
# do something
}
register_filter
$dbi->register_filter(%filters);
$dbi->register_filter(\%filters);
Register filter. Registered filters is available in the following methods or arguments.
default_bind_filter()
default_fetch_filter()
filter
argument ofinsert()
,update()
,update_all()
,delete()
,delete_all()
,select()
,execute
method.DBIx::Custom::Query::default_filter()
DBIx::Csutom::Query::filter()
DBIx::Custom::Result::default_filter()
DBIx::Custom::Result::filter()
Example:
$dbi->register_filter(
encode_utf8 => sub {
my $value = shift;
require Encode;
return Encode::encode('UTF-8', $value);
},
decode_utf8 => sub {
my $value = shift;
require Encode;
return Encode::decode('UTF-8', $value)
}
);
BUGS
Please tell me bugs if found.
<kimoto.yuki at gmail.com>
http://github.com/yuki-kimoto/DBIx-Custom
AUTHOR
Yuki Kimoto, <kimoto.yuki at gmail.com>
COPYRIGHT & LICENSE
Copyright 2009 Yuki Kimoto, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.