... | ... |
@@ -1,3 +1,5 @@ |
1 |
+0.1609 |
|
2 |
+ updated document. |
|
1 | 3 |
0.1608 |
2 | 4 |
update document |
3 | 5 |
renamed DBIx::Custom::QueryBuilder::TagProcessors functions(not backword compatible) |
... | ... |
@@ -457,11 +457,11 @@ DBIx::Custom - DBI interface, having hash parameter binding and filtering system |
457 | 457 |
|
458 | 458 |
=cut |
459 | 459 |
|
460 |
-our $VERSION = '0.1608'; |
|
460 |
+our $VERSION = '0.1609'; |
|
461 | 461 |
|
462 | 462 |
=head1 STABILITY |
463 | 463 |
|
464 |
-B<This module is not stable>. |
|
464 |
+B<This module is not stable>. |
|
465 | 465 |
Method name and implementations will be changed for a while. |
466 | 466 |
|
467 | 467 |
=head1 SYNOPSYS |
... | ... |
@@ -508,7 +508,7 @@ Select |
508 | 508 |
table => 'books', |
509 | 509 |
column => [qw/author title/], |
510 | 510 |
where => {author => 'Ken'}, |
511 |
- append => 'order by id limit 1', |
|
511 |
+ append => 'order by id limit 5', |
|
512 | 512 |
filter => {title => 'encode_utf8'} |
513 | 513 |
); |
514 | 514 |
|
... | ... |
@@ -518,6 +518,13 @@ Select |
518 | 518 |
column => ['books.name as book_name'] |
519 | 519 |
relation => {'books.id' => 'rental.book_id'} |
520 | 520 |
); |
521 |
+ |
|
522 |
+ # Select, more flexible where |
|
523 |
+ my $result = $dbi->select( |
|
524 |
+ table => 'books', |
|
525 |
+ where => ['{= author} and {like title}', |
|
526 |
+ {author => 'Ken', title => '%Perl%'}] |
|
527 |
+ ); |
|
521 | 528 |
|
522 | 529 |
Execute SQL |
523 | 530 |
|
... | ... |
@@ -525,17 +532,17 @@ Execute SQL |
525 | 532 |
$dbi->execute("select title from books"); |
526 | 533 |
|
527 | 534 |
# Execute SQL with hash binding and filtering |
528 |
- $dbi->execute("select id from books where {= author} && {like title}", |
|
535 |
+ $dbi->execute("select id from books where {= author} and {like title}", |
|
529 | 536 |
param => {author => 'ken', title => '%Perl%'}, |
530 | 537 |
filter => {title => 'encode_utf8'}); |
531 | 538 |
|
532 | 539 |
# Create query and execute it |
533 | 540 |
my $query = $dbi->create_query( |
534 |
- "select id from books where {= author} && {like title}" |
|
541 |
+ "select id from books where {= author} and {like title}" |
|
535 | 542 |
); |
536 |
- $dbi->execute($query, param => {author => 'ken', title => '%Perl%'}) |
|
543 |
+ $dbi->execute($query, param => {author => 'Ken', title => '%Perl%'}) |
|
537 | 544 |
|
538 |
-More features. |
|
545 |
+Other features. |
|
539 | 546 |
|
540 | 547 |
# Default filter |
541 | 548 |
$dbi->default_bind_filter('encode_utf8'); |
... | ... |
@@ -556,7 +563,6 @@ Fetch row. |
556 | 563 |
|
557 | 564 |
} |
558 | 565 |
|
559 |
- |
|
560 | 566 |
=head1 DESCRIPTION |
561 | 567 |
|
562 | 568 |
=head2 1. Features |
... | ... |
@@ -566,19 +572,20 @@ such as L<DBIx::Class>, L<DBIx::Simple>. |
566 | 572 |
|
567 | 573 |
This module is not O/R mapper. O/R mapper is useful, |
568 | 574 |
but you must learn many syntax of the O/R mapper, |
569 |
-which is almost another language |
|
570 |
-Create SQL statement is offten not effcient and damage SQL performance. |
|
575 |
+which is almost another language. |
|
576 |
+Created SQL statement is offten not effcient and damage SQL performance. |
|
571 | 577 |
so you have to execute raw SQL in the end. |
572 | 578 |
|
573 | 579 |
L<DBIx::Custom> is middle area between L<DBI> and O/R mapper. |
574 |
-L<DBIx::Custom> provide flexible hash parameter binding adn filtering system, |
|
575 |
-and suger method, such as C<select()>, C<update()>, C<delete()>, C<select()> |
|
576 |
-to execute a query easily. |
|
580 |
+L<DBIx::Custom> provide flexible hash parameter binding and filtering system, |
|
581 |
+and suger methods, such as C<select()>, C<update()>, C<delete()>, C<select()> |
|
582 |
+to execute SQL easily. |
|
577 | 583 |
|
578 |
-L<DBIx::Custom> respects SQL. SQL is not beautiful, but de-facto standard, |
|
579 |
-so all people learing database system know it. |
|
580 |
-If you know SQL statement, |
|
581 |
-you learn a little thing about L<DBIx::Custom> to do your works. |
|
584 |
+L<DBIx::Custom> respects SQL. SQL is very complex and not beautiful, |
|
585 |
+but de-facto standard, |
|
586 |
+so all people learing database know it. |
|
587 |
+If you know SQL, |
|
588 |
+you learn a little thing to do your works, using L<DBIx::Custom> |
|
582 | 589 |
|
583 | 590 |
=head2 1. Connect to the database |
584 | 591 |
|
... | ... |
@@ -594,7 +601,7 @@ If database is SQLite, use L<DBIx::Custom::SQLite>. you connect database easy wa |
594 | 601 |
use DBIx::Custom::SQLite; |
595 | 602 |
my $dbi = DBIx::Custom->connect(database => 'books'); |
596 | 603 |
|
597 |
-If database is MySQL, use L<DBIx::Costm::MySQL>. |
|
604 |
+If database is MySQL, use L<DBIx::Costom::MySQL>. |
|
598 | 605 |
|
599 | 606 |
use DBIx::Custom::MySQL; |
600 | 607 |
my $dbi = DBIx::Custom->connect(database => 'books', |
... | ... |
@@ -603,24 +610,29 @@ If database is MySQL, use L<DBIx::Costm::MySQL>. |
603 | 610 |
=head2 2. Suger methods |
604 | 611 |
|
605 | 612 |
L<DBIx::Custom> has suger methods, such as C<insert()>, C<update()>, |
606 |
-C<delete()> and C<select()>. If you want to do simple works, |
|
607 |
-You don't have to create SQL statement. |
|
613 |
+C<delete()> and C<select()>. If you want to do small works, |
|
614 |
+You don't have to create SQL statements. |
|
608 | 615 |
|
609 | 616 |
=head3 insert() |
610 | 617 |
|
618 |
+Execute insert statement. |
|
619 |
+ |
|
611 | 620 |
$dbi->insert(table => 'books', |
612 | 621 |
param => {title => 'perl', author => 'Ken'}); |
613 | 622 |
|
614 | 623 |
The following SQL is executed. |
615 | 624 |
|
616 |
- insert into (title, author) values (?, ?) |
|
625 |
+ insert into (title, author) values (?, ?); |
|
617 | 626 |
|
618 | 627 |
The values of C<title> and C<author> is embedded into placeholders. |
619 | 628 |
|
620 |
-C<append> and C<filter> argument can be specified if you need. |
|
629 |
+C<append> and C<filter> argument can be specified |
|
630 |
+to C<insert()> method if you need. |
|
621 | 631 |
|
622 | 632 |
=head3 update() |
623 | 633 |
|
634 |
+Execute update statement. |
|
635 |
+ |
|
624 | 636 |
$dbi->update(table => 'books', |
625 | 637 |
param => {title => 'aaa', author => 'Ken'}, |
626 | 638 |
where => {id => 5}); |
... | ... |
@@ -631,12 +643,15 @@ The following SQL is executed. |
631 | 643 |
|
632 | 644 |
The values of C<title> and C<author> is embedded into placeholders. |
633 | 645 |
|
634 |
-If you want to update all rows, use C<update_all()> method instead. |
|
646 |
+C<append> and C<filter> argument can be specified |
|
647 |
+to C<update()> method if you need. |
|
635 | 648 |
|
636 |
-C<append> and C<filter> argument can be specified if you need. |
|
649 |
+If you want to update all rows, use C<update_all()> method instead. |
|
637 | 650 |
|
638 | 651 |
=head3 delete() |
639 | 652 |
|
653 |
+Execute delete statement. |
|
654 |
+ |
|
640 | 655 |
$dbi->delete(table => 'books', |
641 | 656 |
where => {author => 'Ken'}); |
642 | 657 |
|
... | ... |
@@ -644,15 +659,16 @@ The following SQL is executed. |
644 | 659 |
|
645 | 660 |
delete from books where id = ?; |
646 | 661 |
|
647 |
-The value of C<id> is embedded into a placehodler. |
|
662 |
+The value of C<id> is embedded into the placehodler. |
|
648 | 663 |
|
649 |
-C<append> and C<filter> argument can be specified if you need. |
|
664 |
+C<append> and C<filter> argument can be specified |
|
665 |
+to C<delete()> method if you need. |
|
650 | 666 |
|
651 | 667 |
If you want to delete all rows, use C<delete_all()> method instead. |
652 | 668 |
|
653 | 669 |
=head3 select() |
654 | 670 |
|
655 |
-Specify only table: |
|
671 |
+Execute select statement, only C<table> argument specified : |
|
656 | 672 |
|
657 | 673 |
my $result = $dbi->select(table => 'books'); |
658 | 674 |
|
... | ... |
@@ -661,7 +677,7 @@ The following SQL is executed. |
661 | 677 |
select * from books; |
662 | 678 |
|
663 | 679 |
the result of C<select()> method is L<DBIx::Custom::Result> object. |
664 |
-use C<fetch()> method to fetch a row. |
|
680 |
+You can fetch row. |
|
665 | 681 |
|
666 | 682 |
while (my $row = $result->fetch) { |
667 | 683 |
my $title = $row->[0]; |
... | ... |
@@ -669,9 +685,9 @@ use C<fetch()> method to fetch a row. |
669 | 685 |
} |
670 | 686 |
|
671 | 687 |
L<DBIx::Custom::Result> has various methods to fetch row. |
672 |
-See "3. Result of select statement". |
|
688 |
+See "3. Fetch row". |
|
673 | 689 |
|
674 |
-Specify C<column> and C<where> arguments: |
|
690 |
+Specify C<column> and C<where> arguments. |
|
675 | 691 |
|
676 | 692 |
my $result = $dbi->select( |
677 | 693 |
table => 'books', |
... | ... |
@@ -684,7 +700,7 @@ The following SQL is executed. |
684 | 700 |
|
685 | 701 |
the value of C<author> is embdded into placeholder. |
686 | 702 |
|
687 |
-If C<relation> argument is specifed, you can join tables. |
|
703 |
+If you want to join tables, specify C<relation> argument. |
|
688 | 704 |
|
689 | 705 |
my $result = $dbi->select( |
690 | 706 |
table => ['books', 'rental'], |
... | ... |
@@ -698,7 +714,7 @@ The following SQL is executed. |
698 | 714 |
where books.id = rental.book_id; |
699 | 715 |
|
700 | 716 |
C<append> argument add a string to the end of SQL statement. |
701 |
-It is useful to add "order by" or "limit" cluase. |
|
717 |
+You can add "order by" or "limit" cluase. |
|
702 | 718 |
|
703 | 719 |
# Select, more complex |
704 | 720 |
my $result = $dbi->select( |
... | ... |
@@ -711,12 +727,13 @@ The following SQL is executed. |
711 | 727 |
|
712 | 728 |
select * books where author = ? order by price limit 5; |
713 | 729 |
|
714 |
-C<filter> argument can be specified if you need. |
|
730 |
+C<filter> argument can be specified to filter parameters |
|
731 |
+if you need. |
|
715 | 732 |
|
716 |
-=head2 3. Result of select statement |
|
733 |
+=head2 3. Fetch row |
|
717 | 734 |
|
718 |
-C<select> method reurn L<DBIx::Custom::Result> object. |
|
719 |
-Using various methods, you can fetch row. |
|
735 |
+C<select()> method return L<DBIx::Custom::Result> object. |
|
736 |
+You can fetch row by various methods. |
|
720 | 737 |
|
721 | 738 |
Fetch row into array. |
722 | 739 |
|
... | ... |
@@ -771,7 +788,7 @@ Fetch all rows into array of hash |
771 | 788 |
|
772 | 789 |
my $rows = $result->fetch_hash_all; |
773 | 790 |
|
774 |
-If you want to access row statement handle of L<DBI>, use sth() attribute. |
|
791 |
+If you want to access raw statement handle of L<DBI>, use C<sth()> attribute. |
|
775 | 792 |
|
776 | 793 |
my $sth = $result->sth; |
777 | 794 |
|
... | ... |
@@ -788,11 +805,11 @@ At frist, I show normal way of parameter binding. |
788 | 805 |
); |
789 | 806 |
$sth->execute('Ken', '%Perl%'); |
790 | 807 |
|
791 |
-This is very good way because database system enable SQL caching, |
|
792 |
-and parameter is quoted automatically. |
|
808 |
+This is very good way because database system can enable SQL caching, |
|
809 |
+and parameter is quoted automatically, it is secure. |
|
793 | 810 |
|
794 |
-L<DBIx::Custom>hash parameter binding system improve normal parameter binding to |
|
795 |
-specify hash parameter. |
|
811 |
+L<DBIx::Custom> hash parameter binding system improve |
|
812 |
+normal parameter binding way to specify hash parameter. |
|
796 | 813 |
|
797 | 814 |
my $result = $dbi->execute( |
798 | 815 |
"select * from books where {= author} and {like title};" |
... | ... |
@@ -800,12 +817,40 @@ specify hash parameter. |
800 | 817 |
); |
801 | 818 |
|
802 | 819 |
This is same as the normal way, execpt that the parameter is hash. |
803 |
-{= author} is called C<tag>. tag is expand to placeholder internally. |
|
820 |
+{= author} is called C<tag>. tag is expand to placeholder string internally. |
|
804 | 821 |
|
805 | 822 |
select * from books where {= author} and {like title} |
806 | 823 |
-> select * from books where author = ? and title like ?; |
807 | 824 |
|
808 |
-See L<DBIx::Custom::QueryBuilder> to know all tags. |
|
825 |
+The following tags is available. |
|
826 |
+ |
|
827 |
+=head1 Tags |
|
828 |
+ |
|
829 |
+The following tags is available. |
|
830 |
+ |
|
831 |
+ [TAG] [REPLACED] |
|
832 |
+ {? NAME} -> ? |
|
833 |
+ {= NAME} -> NAME = ? |
|
834 |
+ {<> NAME} -> NAME <> ? |
|
835 |
+ |
|
836 |
+ {< NAME} -> NAME < ? |
|
837 |
+ {> NAME} -> NAME > ? |
|
838 |
+ {>= NAME} -> NAME >= ? |
|
839 |
+ {<= NAME} -> NAME <= ? |
|
840 |
+ |
|
841 |
+ {like NAME} -> NAME like ? |
|
842 |
+ {in NAME COUNT} -> NAME in [?, ?, ..] |
|
843 |
+ |
|
844 |
+ {insert NAME1 NAME2} -> (NAME1, NAME2) values (?, ?) |
|
845 |
+ {update NAME1 NAME2} -> set NAME1 = ?, NAME2 = ? |
|
846 |
+ |
|
847 |
+See also L<DBIx::Custom::QueryBuilder>. |
|
848 |
+ |
|
849 |
+Default start tag is '{'. end tag is '}'. |
|
850 |
+You can change this tag. |
|
851 |
+ |
|
852 |
+ $dbi->query_builder->start_tag('|'); |
|
853 |
+ $dbi->query_builder->end_tag('|'); |
|
809 | 854 |
|
810 | 855 |
=head2 5. Filtering |
811 | 856 |
|
... | ... |
@@ -814,7 +859,7 @@ If you want to save the string to database, You must encode the string. |
814 | 859 |
Filtering system help you to convert a data to another data |
815 | 860 |
when you save to the data and get the data form database. |
816 | 861 |
|
817 |
-If you want to register filter, use register_filter() method. |
|
862 |
+If you want to register filter, use C<register_filter()> method. |
|
818 | 863 |
|
819 | 864 |
$dbi->register_filter( |
820 | 865 |
to_upper_case => sub { |
... | ... |
@@ -829,7 +874,7 @@ You can specify these filters to C<filter> argument of C<execute()> method. |
829 | 874 |
|
830 | 875 |
my $result = $dbi->execute( |
831 | 876 |
"select * from books where {= author} and {like title};" |
832 |
- param => {author => 'Ken', title => '%Perl%'}); |
|
877 |
+ param => {author => 'Ken', title => '%Perl%'}, |
|
833 | 878 |
filter => {author => 'to_upper_case, title => 'encode_utf8'} |
834 | 879 |
); |
835 | 880 |
|
... | ... |
@@ -848,8 +893,7 @@ delete(), delete_all(), select(). |
848 | 893 |
filter => {title => 'encode_utf8'} |
849 | 894 |
); |
850 | 895 |
|
851 |
-Filter work to each parmeter, but you prepare default filter for all parameters. |
|
852 |
-you can use C<default_bind_filter()> attribute. |
|
896 |
+Filter works each parmeter, but you prepare default filter for all parameters. |
|
853 | 897 |
|
854 | 898 |
$dbi->default_bind_filter('encode_utf8'); |
855 | 899 |
|
... | ... |
@@ -870,7 +914,7 @@ This is same as the following one. |
870 | 914 |
filter => {title => 'encode_uft8' author => 'to_upper_case'} |
871 | 915 |
); |
872 | 916 |
|
873 |
-You can also specify filter when the row is fetching. This is reverse of bindig filter. |
|
917 |
+You can also specify filter when the row is fetched. This is reverse of bind filter. |
|
874 | 918 |
|
875 | 919 |
my $result = $dbi->select(table => 'books'); |
876 | 920 |
$result->filter({title => 'decode_utf8', author => 'to_upper_case'}); |
... | ... |
@@ -879,7 +923,7 @@ you can specify C<default_fetch_filter()>. |
879 | 923 |
|
880 | 924 |
$dbi->default_fetch_filter('decode_utf8'); |
881 | 925 |
|
882 |
-C<DBIx::Custom::Result::filter> overwrites the filter specified |
|
926 |
+C<DBIx::Custom::Result::filter()> overwrites the filter specified |
|
883 | 927 |
by C<default_fetch_filter()> |
884 | 928 |
|
885 | 929 |
$dbi->default_fetch_filter('decode_utf8'); |
... | ... |
@@ -897,6 +941,112 @@ This is same as the following one. |
897 | 941 |
); |
898 | 942 |
$result->filter({title => 'decode_utf8', author => 'to_upper_case'}); |
899 | 943 |
|
944 |
+=head2 6. Performance |
|
945 |
+ |
|
946 |
+If you execute insert statement by using select() method, |
|
947 |
+you sometimes can't meet performance requirment. |
|
948 |
+ |
|
949 |
+C<insert()> method is a little slow because SQL statement and statement handle |
|
950 |
+is created every time. |
|
951 |
+ |
|
952 |
+In that case, you can prepare a query by C<create_query()> method. |
|
953 |
+ |
|
954 |
+ my $query = $dbi->create_query( |
|
955 |
+ "insert into books {insert title author};" |
|
956 |
+ ); |
|
957 |
+ |
|
958 |
+ # (In the case of update statement) |
|
959 |
+ my $query = $dbi->create_query( |
|
960 |
+ "update books {update author};"; |
|
961 |
+ ); |
|
962 |
+ |
|
963 |
+Execute query repeatedly |
|
964 |
+ |
|
965 |
+ my $inputs = [ |
|
966 |
+ {title => 'Perl', author => 'Ken'}, |
|
967 |
+ {title => 'Good days', author => 'Mike'} |
|
968 |
+ ]; |
|
969 |
+ |
|
970 |
+ foreach my $input (@$inputs) { |
|
971 |
+ $dbi->execute($query, $input); |
|
972 |
+ } |
|
973 |
+ |
|
974 |
+This is faster than C<insert()> and C<update()> method. |
|
975 |
+ |
|
976 |
+C<execute()> method cache the parsing result of SQL soruce. |
|
977 |
+Default to 1 |
|
978 |
+ |
|
979 |
+ $dbi->cache(1); |
|
980 |
+ |
|
981 |
+Caching is on memory, but you can change this by C<cache_method()>. |
|
982 |
+First argument is L<DBIx::Custom> object. |
|
983 |
+Second argument is SQL source, |
|
984 |
+such as "select * from books where {=title} and {=author};"; |
|
985 |
+Third argument is parsed result, such as |
|
986 |
+{sql => "select * from books where title = ? and author = ?", |
|
987 |
+ columns => ['title', 'author']}, this is hash reference. |
|
988 |
+If argument is more than two, this is called ti set cache. |
|
989 |
+otherwise, called to get cache. |
|
990 |
+ |
|
991 |
+ $dbi->cache_mehod(sub { |
|
992 |
+ sub { |
|
993 |
+ my $self = shift; |
|
994 |
+ |
|
995 |
+ $self->{_cached} ||= {}; |
|
996 |
+ |
|
997 |
+ # Set cache |
|
998 |
+ if (@_ > 1) { |
|
999 |
+ $self->{_cached}{$_[0]} = $_[1] |
|
1000 |
+ } |
|
1001 |
+ |
|
1002 |
+ # Get cache |
|
1003 |
+ else { |
|
1004 |
+ return $self->{_cached}{$_[0]} |
|
1005 |
+ } |
|
1006 |
+ } |
|
1007 |
+ }); |
|
1008 |
+ |
|
1009 |
+=head2 7. More features |
|
1010 |
+ |
|
1011 |
+=head3 Get DBI object |
|
1012 |
+ |
|
1013 |
+You can get L<DBI> object and call any method of L<DBI>. |
|
1014 |
+ |
|
1015 |
+ $dbi->dbh->begin_work; |
|
1016 |
+ $dbi->dbh->commit; |
|
1017 |
+ $dbi->dbh->rollback; |
|
1018 |
+ |
|
1019 |
+=head3 Change Result class |
|
1020 |
+ |
|
1021 |
+You can change Result class if you need. |
|
1022 |
+ |
|
1023 |
+ package Your::Result; |
|
1024 |
+ use base 'DBIx::Custom::Result'; |
|
1025 |
+ |
|
1026 |
+ sub some_method { ... } |
|
1027 |
+ |
|
1028 |
+ 1; |
|
1029 |
+ |
|
1030 |
+ package main; |
|
1031 |
+ |
|
1032 |
+ use Your::Result; |
|
1033 |
+ |
|
1034 |
+ my $dbi = DBIx::Custom->connect(...); |
|
1035 |
+ $dbi->result_class('Your::Result'); |
|
1036 |
+ |
|
1037 |
+=head3 Custamize SQL builder object |
|
1038 |
+ |
|
1039 |
+You can custamize SQL builder object |
|
1040 |
+ |
|
1041 |
+ my $dbi = DBIx::Custom->connect(...); |
|
1042 |
+ $dbi->query_builder->start_tag('|'); |
|
1043 |
+ $dbi->query_builder->end_tag('|'); |
|
1044 |
+ $dbi->query_builder->register_tag_processor( |
|
1045 |
+ name => sub { |
|
1046 |
+ ... |
|
1047 |
+ } |
|
1048 |
+ ); |
|
1049 |
+ |
|
900 | 1050 |
=head1 ATTRIBUTES |
901 | 1051 |
|
902 | 1052 |
=head2 C<user> |