Newer Older
241 lines | 7.952kb
added experimental expand me...
yuki-kimoto authored on 2010-10-20
1
=encoding utf8
2

            
updated document
yuki-kimoto authored on 2010-10-22
3
=head1 NAME
added experimental expand me...
yuki-kimoto authored on 2010-10-20
4

            
updated document
yuki-kimoto authored on 2010-10-22
5
DBIx::Custom::Guides::Ja - DBIx::Customの日本語ガイド
added experimental expand me...
yuki-kimoto authored on 2010-10-20
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
Yuki Kimoto authored on 2011-01-20
15
また、O/Rマッパによって生成されたSQLは非効率なことがありますし、
16
複雑なSQLを生成することができないので、
17
生のSQLを発行しなければならない場合がたくさんあります。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
18

            
updated document
Yuki Kimoto authored on 2011-01-20
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...
yuki-kimoto authored on 2010-10-20
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...
root authored on 2010-11-26
63
B<Data sourceのサンプル:>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
64

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
65
MySQL
added experimental expand me...
yuki-kimoto authored on 2010-10-20
66

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
67
    "dbi:mysql:database=$database"
68
    "dbi:mysql:database=$database;host=$hostname;port=$port"
added experimental expand me...
yuki-kimoto authored on 2010-10-20
69

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
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...
yuki-kimoto authored on 2010-10-20
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
Yuki Kimoto authored on 2011-01-12
119
    $dbi->insert(table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
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
Yuki Kimoto authored on 2011-01-12
131
    $dbi->update(table  => 'book', 
added experimental expand me...
yuki-kimoto authored on 2010-10-20
132
                 param  => {title => 'Perl', author => 'Ken'}, 
133
                 where  => {id => 5});
134

            
135
これは次のL<DBI>の操作と同じです。
136

            
137
    my $sth = $dbh->prepare(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
138
        'update book set title = ?, author = ? where id = ?;');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
139
    $sth->execute('Perl', 'Ken', 5);
140

            
141
C<update>メソッドは安全のため
142
where句のないSQLを発行することを許可していません。
143
もしすべての行を更新したい場合は
144
C<update_all()>メソッドを使用してください。
145

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
146
    $dbi->update_all(table  => 'book', 
added experimental expand me...
yuki-kimoto authored on 2010-10-20
147
                     param  => {title => 'Perl', author => 'Ken'});
148

            
149
=head3 C<delete()>
150

            
151
C<delete>メソッドです。データベースのデータを削除します。
152

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
153
    $dbi->delete(table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
154
                 where  => {author => 'Ken'});
155

            
156
これは次のL<DBI>の操作と同じです。
157

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
158
    my $sth = $dbh->prepare('delete from book where id = ?;');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
159
    $sth->execute('Ken');
160

            
161
C<delete>メソッドは安全のため
162
where句のないSQLを発行することを許可していません。
163
もしすべての行を削除したい場合は
164
C<delete_all()>メソッドを使用してください。
165

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
166
    $dbi->delete_all(table  => 'book');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
167

            
168
=head3 C<select()>
169

            
170
C<select>メソッドです。テーブル名だけを指定しています。
171

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
172
    my $result = $dbi->select(table => 'book');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
173

            
174
これは次のL<DBI>の操作と同じです。
175

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
176
    my $sth = $dbh->prepare('select * from book;);
added experimental expand me...
yuki-kimoto authored on 2010-10-20
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
Yuki Kimoto authored on 2011-01-12
191
        table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
192
        column => [qw/author title/],
193
        where  => {author => 'Ken'}
194
    );
195

            
196
次のL<DBI>の操作と同じです。
197
    
198
    my $sth = $dbh->prepare(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
199
        'select author, title from book where author = ?;');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
200
    $sht->execute('Ken');
201

            
202
テーブルをjoinしたい場合はC<relation>を使用します。
203

            
204
    my $result = $dbi->select(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
205
        table    => ['book', 'rental'],
206
        column   => ['book.name as book_name']
207
        relation => {'book.id' => 'rental.book_id'}
added experimental expand me...
yuki-kimoto authored on 2010-10-20
208
    );
209

            
210
次のL<DBI>の操作と同じです。
211

            
212
    my $sth = $dbh->prepare(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
213
        'select book.name as book_name from book, rental' .
214
        'where book.id = rental.book_id;');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
215
    $sth->execute;
216

            
217
SQL文の末尾に文字列を追加したい場合は<append>オプションを使用します。
218

            
219
    my $result = $dbi->select(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
220
        table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
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
Yuki Kimoto authored on 2011-01-12
228
        'select * book where author = ? order by price limit 5;');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
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
Yuki Kimoto authored on 2011-01-12
238
    $dbi->insert(table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
239
                 param  => {title => 'Perl', author => 'Ken'});
240
                 filter => {title  => 'encode_utf8',
updated document
Yuki Kimoto authored on 2011-01-20
241
                            a