added experimental expand me...
|
1 |
=encoding utf8 |
2 | ||
updated document
|
3 |
=head1 NAME |
added experimental expand me...
|
4 | |
updated document
|
5 |
DBIx::Custom::Guides::Ja - DBIx::Customの日本語ガイド |
added experimental expand me...
|
6 | |
7 |
=head1 ガイド |
|
8 | ||
9 |
L<DBIx::Custom>はデータベースへのクエリの発行を簡単に行うための |
|
10 |
クラスです。L<DBIx::Class>やL<DBIx::Simple>と同じように |
|
11 |
L<DBI>のラッパクラスになっています。 |
|
12 | ||
13 |
L<DBIx::Custom>はO/Rマッパーではありません。O/Rマッパーは |
|
14 |
便利ですが、O/Rマッパのたくさんの文法を覚える必要があります。 |
|
updated document
|
15 |
また、O/Rマッパによって生成されたSQLは非効率なことがありますし、 |
16 |
複雑なSQLを生成することができないので、 |
|
17 |
生のSQLを発行しなければならない場合がたくさんあります。 |
|
added experimental expand me...
|
18 | |
updated document
|
19 |
L<DBIx::Custom>はO/Rマッパとは対照的な設計が行われています。 |
20 |
L<DBIx::Custom>の主な目的は、SQLを尊重しつつ、DBIだけでは |
|
21 |
とてもめんどうな作業を簡単にすることです。もしSQLについて |
|
22 |
多くの知識を持っているならば、L<DBIx::Custom>でそのまま |
|
23 |
生かすことができます。 |
|
24 | ||
25 |
L<DBIx::Custom>の仕組みを簡単に説明しておきましょう。 |
|
26 |
L<DBIx::Custom>では、タグと呼ばれるものを |
|
27 |
SQLの中に埋め込むことができます。 |
|
28 | ||
29 |
select * from book where {= title} and {=author}; |
|
30 | ||
31 |
{}で囲まれた部分がタグです。このSQLは実際に実行されるときには |
|
32 |
次のようにプレースホルダに展開されます。 |
|
33 | ||
34 |
select * from book where title = ? and title = ?; |
|
35 | ||
36 |
これらの展開にはどのような意味があるのでしょうかと質問 |
|
37 |
されることかと思います。 |
|
38 | ||
39 | ||
40 | ||
41 | ||
42 |
またSQLを簡単に実行するための、 |
|
added experimental expand me...
|
43 |
C<insert()>, C<update()>, C<delete()>,C<select()>などの |
44 |
シュガーメソッドも提供します。 |
|
45 | ||
46 |
L<DBIx::Custom>はSQLを尊重します。SQLはとても複雑で、美しくはありません。 |
|
47 |
けれども、SQLはデファクトスタンダードな技術です。 |
|
48 |
ですので、データベースを学ぶすべての人はSQLを知っています。 |
|
49 |
あなたがすでにSQLを知っているなら、L<DBIx::Custom>を使って |
|
50 |
何かを行うために覚えることはとても少ないです。 |
|
51 | ||
52 |
では使い方を解説します。 |
|
53 | ||
54 |
=head2 1. データベースへの接続 |
|
55 | ||
56 |
L<DBIx::Custom>オブジェクトを生成し、データベースに接続するには |
|
57 |
C<connect()>メソッドを使用します。 |
|
58 | ||
59 |
use DBIx::Custom; |
|
60 |
my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname", |
|
61 |
user => 'ken', password => '!LFKD%$&'); |
|
62 | ||
deprecated DBIx::Custom::MyS...
|
63 |
B<Data sourceのサンプル:> |
added experimental expand me...
|
64 | |
deprecated DBIx::Custom::MyS...
|
65 |
MySQL |
added experimental expand me...
|
66 | |
deprecated DBIx::Custom::MyS...
|
67 |
"dbi:mysql:database=$database" |
68 |
"dbi:mysql:database=$database;host=$hostname;port=$port" |
|
added experimental expand me...
|
69 | |
deprecated DBIx::Custom::MyS...
|
70 |
SQLite |
71 | ||
72 |
"dbi:SQLite:dbname=$database" |
|
73 |
"dbi:SQLite:dbname=:memory:" |
|
74 | ||
75 |
PostgreSQL |
|
76 | ||
77 |
"dbi:Pg:dbname=$dbname" |
|
78 | ||
79 |
Oracle |
|
80 | ||
81 |
"dbi:Oracle:$dbname" |
|
82 |
"dbi:Oracle:host=$host;sid=$sid" |
|
83 | ||
84 |
ODBC(Microsoft Access) |
|
85 | ||
86 |
"dbi:ODBC:driver=Microsoft Access Driver (*.mdb);dbq=hoge.mdb" |
|
87 | ||
88 |
ODBC(SQL Server) |
|
89 | ||
90 |
"dbi:ODBC:driver={SQL Server};Server=(local);database=test;Trusted_Connection=yes;AutoTranslate=No;" |
|
added experimental expand me...
|
91 | |
92 |
L<DBIx::Custom>はL<DBI>のラッパです。 |
|
93 |
L<DBI>オブジェクトはC<dbh>で取得することができます。 |
|
94 | ||
95 |
my $dbh = $dbi->dbh; |
|
96 | ||
97 |
データベースハンドル属性にはデフォルトで次のものが設定されます。 |
|
98 |
|
|
99 |
$dbi->dbh->{RaiseError} = 1; |
|
100 |
$dbi->dbh->{PrintError} = 0; |
|
101 |
$dbi->dbh->{AutoCommit} = 1; |
|
102 | ||
103 |
この設定を行っているので、致命的なエラーが起こると、 |
|
104 |
例外が発生しプログラムは終了します。 |
|
105 |
またクエリが発行されると自動的にコミットされます。 |
|
106 | ||
107 |
=head2 2. シュガーメソッド |
|
108 | ||
109 |
L<DBIx::Custom>は、 |
|
110 |
C<insert()>、C<update()>、C<delete()>、C<select()> |
|
111 |
のようなシュガーメソッドを持っています。 |
|
112 |
小さなことを行うのであれば、SQL文を |
|
113 |
作成する必要はありません。 |
|
114 | ||
115 |
=head3 C<insert()> |
|
116 | ||
117 |
C<insert>メソッドです。データベースにデータを挿入します。 |
|
118 | ||
remove DBIx::Custom::Model
|
119 |
$dbi->insert(table => 'book', |
added experimental expand me...
|
120 |
param => {title => 'Perl', author => 'Ken'}); |
121 | ||
122 |
これは次のL<DBI>の操作と同じです。 |
|
123 | ||
124 |
my $sth = $dbh->prepare('insert into (title, author) values (?, ?);'); |
|
125 |
$sth->execute('Perl', 'Ken'); |
|
126 | ||
127 |
=head3 C<update()> |
|
128 | ||
129 |
C<update>メソッドです。データベースのデータを更新します。 |
|
130 | ||
remove DBIx::Custom::Model
|
131 |
$dbi->update(table => 'book', |
added experimental expand me...
|
132 |
param => {title => 'Perl', author => 'Ken'}, |
133 |
where => {id => 5}); |
|
134 | ||
135 |
これは次のL<DBI>の操作と同じです。 |
|
136 | ||
137 |
my $sth = $dbh->prepare( |
|
remove DBIx::Custom::Model
|
138 |
'update book set title = ?, author = ? where id = ?;'); |
added experimental expand me...
|
139 |
$sth->execute('Perl', 'Ken', 5); |
140 | ||
141 |
C<update>メソッドは安全のため |
|
142 |
where句のないSQLを発行することを許可していません。 |
|
143 |
もしすべての行を更新したい場合は |
|
144 |
C<update_all()>メソッドを使用してください。 |
|
145 | ||
remove DBIx::Custom::Model
|
146 |
$dbi->update_all(table => 'book', |
added experimental expand me...
|
147 |
param => {title => 'Perl', author => 'Ken'}); |
148 | ||
149 |
=head3 C<delete()> |
|
150 | ||
151 |
C<delete>メソッドです。データベースのデータを削除します。 |
|
152 | ||
remove DBIx::Custom::Model
|
153 |
$dbi->delete(table => 'book', |
added experimental expand me...
|
154 |
where => {author => 'Ken'}); |
155 | ||
156 |
これは次のL<DBI>の操作と同じです。 |
|
157 | ||
remove DBIx::Custom::Model
|
158 |
my $sth = $dbh->prepare('delete from book where id = ?;'); |
added experimental expand me...
|
159 |
$sth->execute('Ken'); |
160 | ||
161 |
C<delete>メソッドは安全のため |
|
162 |
where句のないSQLを発行することを許可していません。 |
|
163 |
もしすべての行を削除したい場合は |
|
164 |
C<delete_all()>メソッドを使用してください。 |
|
165 | ||
remove DBIx::Custom::Model
|
166 |
$dbi->delete_all(table => 'book'); |
added experimental expand me...
|
167 | |
168 |
=head3 C<select()> |
|
169 | ||
170 |
C<select>メソッドです。テーブル名だけを指定しています。 |
|
171 | ||
remove DBIx::Custom::Model
|
172 |
my $result = $dbi->select(table => 'book'); |
added experimental expand me...
|
173 | |
174 |
これは次のL<DBI>の操作と同じです。 |
|
175 | ||
remove DBIx::Custom::Model
|
176 |
my $sth = $dbh->prepare('select * from book;); |
added experimental expand me...
|
177 |
$sth->execute; |
178 | ||
179 |
C<select()>メソッドの戻り値はL<DBIx::Custom::Result> |
|
180 |
オブジェクトです。C<fetch>メソッドを使用して |
|
181 |
行をフェッチすることができます。 |
|
182 | ||
183 |
while (my $row = $result->fetch) { |
|
184 |
my $title = $row->[0]; |
|
185 |
my $author = $row->[1]; |
|
186 |
} |
|
187 | ||
188 |
次のC<select>は行の名前とwhere句を指定したものです。 |
|
189 | ||
190 |
my $result = $dbi->select( |
|
remove DBIx::Custom::Model
|
191 |
table => 'book', |
added experimental expand me...
|
192 |
column => [qw/author title/], |
193 |
where => {author => 'Ken'} |
|
194 |
); |
|
195 | ||
196 |
次のL<DBI>の操作と同じです。 |
|
197 |
|
|
198 |
my $sth = $dbh->prepare( |
|
remove DBIx::Custom::Model
|
199 |
'select author, title from book where author = ?;'); |
added experimental expand me...
|
200 |
$sht->execute('Ken'); |
201 | ||
202 |
テーブルをjoinしたい場合はC<relation>を使用します。 |
|
203 | ||
204 |
my $result = $dbi->select( |
|
remove DBIx::Custom::Model
|
205 |
table => ['book', 'rental'], |
206 |
column => ['book.name as book_name'] |
|
207 |
relation => {'book.id' => 'rental.book_id'} |
|
added experimental expand me...
|
208 |
); |
209 | ||
210 |
次のL<DBI>の操作と同じです。 |
|
211 | ||
212 |
my $sth = $dbh->prepare( |
|
remove DBIx::Custom::Model
|
213 |
'select book.name as book_name from book, rental' . |
214 |
'where book.id = rental.book_id;'); |
|
added experimental expand me...
|
215 |
$sth->execute; |
216 | ||
217 |
SQL文の末尾に文字列を追加したい場合は<append>オプションを使用します。 |
|
218 | ||
219 |
my $result = $dbi->select( |
|
remove DBIx::Custom::Model
|
220 |
table => 'book', |
added experimental expand me...
|
221 |
where => {author => 'Ken'}, |
222 |
append => 'order by price limit 5', |
|
223 |
); |
|
224 | ||
225 |
次のL<DBI>の操作と同じです。 |
|
226 | ||
227 |
my $sth = $dbh->prepare( |
|
remove DBIx::Custom::Model
|
228 |
'select * book where author = ? order by price limit 5;'); |
added experimental expand me...
|
229 |
$sth->execute; |
230 | ||
231 |
C<append>オプションは、C<insert()>、C<update()>、C<update_all()> |
|
232 |
C<delete()>、C<select>メソッドで使用することが |
|
233 |
できます。 |
|
234 | ||
235 |
この後のフィルタリングの解説で詳しく扱いますが、値をフィルタリングしたい |
|
236 |
場合はC<filter>オプションを使用することができます。 |
|
237 | ||
remove DBIx::Custom::Model
|
238 |
$dbi->insert(table => 'book', |
added experimental expand me...
|
239 |
param => {title => 'Perl', author => 'Ken'}); |
240 |
filter => {title => 'encode_utf8', |
|
updated document
|
241 |
a |