Kato Atsushi
ktats****@users*****
2007年 6月 20日 (水) 08:17:51 JST
Index: docs/modules/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Cookbook.pod diff -u docs/modules/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Cookbook.pod:1.1 docs/modules/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Cookbook.pod:1.2 --- docs/modules/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Cookbook.pod:1.1 Tue Jun 19 09:23:36 2007 +++ docs/modules/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Cookbook.pod Wed Jun 20 08:17:51 2007 @@ -1,18 +1,18 @@ -=head1 åå +=head1 名前 -DBIx::Class::Manual::Cookbook - ã¬ã·ããããã +DBIx::Class::Manual::Cookbook - レシピいろいろ -=head1 ã¬ã·ã +=head1 レシピ -=head2 æ¤ç´¢ +=head2 検索 -=head3 ãã¼ã¸å¦çãããçµæã»ãã +=head3 ページ処理された結果セット When you expect a large number of results, you can ask L<DBIx::Class> for a paged resultset, which will fetch only a small number of records at a time: -çµæã»ãããè¨å¤§ã«ãªããããªãããã¼ã¸å¦çãããçµæãL<DBIx::Class>ã§åå¾ã§ãã¾ãã -ä¸åã«ãå°ãã®ã¬ã³ã¼ãããã¨ã£ã¦ãã¾ãã: +結果セットが膨大になりそうなら、ページ処理された結果をL<DBIx::Class>で取得できます。 +一回に、少しのレコードしかとってきません: my $rs = $schema->resultset('Artist')->search( undef, @@ -26,7 +26,7 @@ The C<page> attribute does not have to be specified in your search: -C<page>å±æ§ã¯æ¤ç´¢ã«æå®ããå¿ è¦ã¯ããã¾ãã: +C<page>属性は検索に指定する必要はありません: my $rs = $schema->resultset('Artist')->search( undef, @@ -40,16 +40,16 @@ In either of the above cases, you can return a L<Data::Page> object for the resultset (suitable for use in e.g. a template) using the C<pager> method: -ä¸ã®ã±ã¼ã¹ã§ããçµæã»ããã«ãL<Data::Page>ãªãã¸ã§ã¯ã(ãã³ãã¬ã¼ãã«ä½¿ãã®ã«é©ãã) -ãå¾ããã¨ãã§ãã¾ããC<pager>ã¡ã½ããã使ã£ã¦: +上のケースでも、結果セットに、L<Data::Page>オブジェクト(テンプレートに使うのに適した) +を得ることができます。C<pager>メソッドを使って: return $rs->pager(); -=head3 è¤é㪠WHEREç¯ +=head3 複雑な WHERE節 Sometimes you need to formulate a query using specific operators: -ç¹å®ã®æ¼ç®åã使ã£ãã¯ã¨ãªãå®å¼åããå¿ è¦ãããæãããã§ããã: +特定の演算子を使ったクエリを定式化する必要がある時もあるでしょう: my @albums = $schema->resultset('Album')->search({ artist => { 'like', '%Lamb%' }, @@ -58,13 +58,13 @@ This results in something like the following C<WHERE> clause: -çµæã¯ä¸è¨ã®C<WHERE>ç¯ã®ãããªãã®ã«ãªãã¾ã: +結果は下記のC<WHERE>節のようなものになります: WHERE artist LIKE '%Lamb%' AND title LIKE '%Fear of Fours%' Other queries might require slightly more complex logic: -ããã¡ãã£ã¨è¤éãªãã¸ãã¯ãå¿ è¦ãªä»ã®ã¯ã¨ãªãããã§ããã: +もうちょっと複雑なロジックが必要な他のクエリもあるでしょう: my @albums = $schema->resultset('Album')->search({ -or => [ @@ -78,7 +78,7 @@ This results in the following C<WHERE> clause: -çµæã¯ä¸è¨ã®C<WHERE>ç¯ã«ãªãã¾ã: +結果は下記のC<WHERE>節になります: WHERE ( artist LIKE '%Smashing Pumpkins%' AND title = 'Siamese Dream' ) OR artist = 'Starchildren' @@ -86,18 +86,18 @@ For more information on generating complex queries, see L<SQL::Abstract/WHERE CLAUSES>. -è¤éãªã¯ã¨ãªãã¤ããããã®ãã詳ãã説æã¯ãL<SQL::Abstract/WHERE CLAUSES>ãè¦ã¦ãã ããã +複雑なクエリをつくるためのより詳しい説明は、L<SQL::Abstract/WHERE CLAUSES>を見てください。 -=head3 ç¹å®ã®ã«ã©ã ã使ã +=head3 特定のカラムを使う When you only want specific columns from a table, you can use C<columns> to specify which ones you need. This is useful to avoid loading columns with large amounts of data that you aren't about to use anyway: -ãã¼ãã«ããç¹å®ã®ã«ã©ã ã欲ããã ãã®ã¨ãã«ã¯ãC<columns>ã使ã£ã¦ã -å¿ è¦ãªãã®ãæå®ã§ãã¾ããä½ã«ã使ããªã大éã®ãã¼ã¿ãåãè¾¼ãã®ã -é¿ãããã¨ãã§ãã¾ãã +テーブルから特定のカラムが欲しいだけのときには、C<columns>を使って、 +必要なものを指定できます。何にも使わない大量のデータを取り込むのを +避けることができます。 my $rs = $schema->resultset('Artist')->search( undef, @@ -112,10 +112,10 @@ This is a shortcut for C<select> and C<as>, see below. C<columns> cannot be used together with C<select> and C<as>. -å¾ã§ãè¦ã¾ãããããã¯ãC<select>ã¨C<as>ã®ã·ã§ã¼ãã«ããã§ãã -C<columns>ã¯C<select>ã¨C<as>ã¨ä¸ç·ã«ã¯ä½¿ãã¾ããã +後でも見ますが、これは、C<select>とC<as>のショートカットです。 +C<columns>はC<select>とC<as>と一緒には使えません。 -=head3 ãã¼ã¿ãã¼ã¹ã®é¢æ°ãã¹ãã¢ãããã·ã¼ã¸ã£ã使ã +=head3 データベースの関数やストアドプロシージャを使う The combination of C<select> and C<as> can be used to return the result of a database function or stored procedure as a column value. You use C<select> to @@ -123,11 +123,11 @@ stored procedure name). You then use C<as> to set the column name you will use to access the returned value: -C<select>ã¨C<as>ã®çµã¿åããã§ãã«ã©ã ã®å¤ã¨ãã¦ãã¼ã¿ãã¼ã¹é¢æ°ãã¹ãã¢ã -ããã·ã¼ã¸ã£ã®çµæãè¿ãã®ã«ä½¿ããã¨ãåºæ¥ã¾ããC<select>ã使ã£ã¦ãã«ã©ã ã® -å¤ã®ããã®ã½ã¼ã¹ãæå®ã§ãã¾ã(ä¾ãã°ãã«ã©ã åãé¢æ°ãã¹ãã¢ãããã·ã¼ã¸ã£å)ã -ãããããC<as>ããè¿ãããå¤ã«ã¢ã¯ã»ã¹ããã®ã«ä½¿ãã«ã©ã åãã»ããããã®ã« -使ãã¾ã: +C<select>とC<as>の組み合わせで、カラムの値としてデータベース関数やストアド +プロシージャの結果を返すのに使うことが出来ます。C<select>を使って、カラムの +値のためのソースを指定できます(例えば、カラム名、関数、ストアドプロシージャ名)。 +それから、C<as>を、返された値にアクセスするのに使うカラム名をセットするのに +使えます: my $rs = $schema->resultset('Artist')->search( {}, @@ -148,11 +148,11 @@ just access it as normal. Our C<Artist> class has a C<name> column, so we just use the C<name> accessor: -C< as >å±æ§ã¯ãSQLã®ã·ã³ã¿ãã¯ã¹C< SELECT foo AS bar>ã¨ã¾ã£ããé¢ä¿ãªããã¨ã« -æ°ãã¤ãã¦ãã ãã(L<DBIx::Class::ResultSet/ATTRIBUTES>ã®ããã¥ã¡ã³ããè¦ã¦ãã ãã)ã -ãã¼ã¹ã¯ã©ã¹ã«ã«ã©ã ã¨ãã¦ã¨ã¤ãªã¢ã¹ããã(ããªãã¡ãC<add_columns>ã§è¿½å ããã¦ãã)ã®ãªãã -æ®éã«ããã«ã¢ã¯ã»ã¹ã§ãã¾ããC<Artist>ã¯ã©ã¹ã«ã¯ãC<name>ã«ã©ã ãããã®ã§ã -C<name>ã¢ã¯ã»ãµã使ãã¾ã: +C< as >属性は、SQLのシンタックスC< SELECT foo AS bar>とまったく関係ないことに +気をつけてください(L<DBIx::Class::ResultSet/ATTRIBUTES>のドキュメントを見てください)。 +ベースクラスにカラムとしてエイリアスがある(すなわち、C<add_columns>で追加されている)のなら、 +普通にそれにアクセスできます。C<Artist>クラスには、C<name>カラムがあるので、 +C<name>アクセサを使えます: my $artist = $rs->first(); my $name = $artist->name(); @@ -160,16 +160,16 @@ If on the other hand the alias does not correspond to an existing column, you have to fetch the value using the C<get_column> accessor: -ä¸æ¹ã§ãã¨ã¤ãªã¢ã¹ãæ¢åã®ã«ã©ã ã«ä¸è´ããªããªããC<get_column>ã¢ã¯ã»ãµã使ã£ã¦ã -å¤ãåå¾ããå¿ è¦ãããã¾ã: +一方で、エイリアスが既存のカラムに一致しないなら、C<get_column>アクセサを使って、 +値を取得する必要があります: my $name_length = $artist->get_column('name_length'); If you don't like using C<get_column>, you can always create an accessor for any of your aliases using either of these: -C<get_column>ãæ°ã«å ¥ããªããã°ããã¤ã§ããä¸è¨ã®ããããã使ã£ã¦ã©ã㪠-ã¨ã¤ãªã¢ã¹ã«ãã¢ã¯ã»ãµãä½ãã¾ã: +C<get_column>が気に入らなければ、いつでも、下記のいずれかを使ってどんな +エイリアスにもアクセサを作れます: # Define accessor manually: sub name_length { shift->get_column('name_length'); } @@ -203,11 +203,11 @@ } ); -=head3 çµæã®ã°ã«ã¼ãã³ã° +=head3 結果のグルーピング L<DBIx::Class> supports C<GROUP BY> as follows: -L<DBIx::Class>ã¯C<GROUP BY>ããµãã¼ããã¾ã: +L<DBIx::Class>はC<GROUP BY>をサポートします: my $rs = $schema->resultset('Artist')->search( {}, @@ -228,16 +228,16 @@ are in any way unsure about the use of the attributes above (C< join >, C< select >, C< as > and C< group_by >). -ä¸è¨ã®(C< join >ã C< select >ã C< as >ã C< group_by>)å±æ§ã®ä½¿ãæ¹ãããããªããã°ã -L<DBIx::Class::ResultSet/ATTRIBUTES>ããã¥ã¡ã³ããã¿ã¦ãã ããã +上記の(C< join >、 C< select >、 C< as >、 C< group_by>)属性の使い方がわからなければ、 +L<DBIx::Class::ResultSet/ATTRIBUTES>ドキュメントをみてください。 -=head3 å ã«å®ç¾©ãããæ¤ç´¢ +=head3 先に定義された検索 You can write your own L<DBIx::Class::ResultSet> class by inheriting from it and define often used searches as methods: -L<DBIx::Class::ResultSet>ã¯ã©ã¹ãç¶æ¿ãã¦ãèªåèªèº«ã®ã¯ã©ã¹ãæ¸ãããã使ã -æ¤ç´¢ãã¡ã½ããã¨ãã¦å®ç¾©ã§ãã¾ã: +L<DBIx::Class::ResultSet>クラスを継承して、自分自身のクラスを書き、よく使う +検索をメソッドとして定義できます: package My::DBIC::ResultSet::CD; use strict; @@ -258,26 +258,26 @@ To use your resultset, first tell DBIx::Class to create an instance of it for you, in your My::DBIC::Schema::CD class: -èªåã®çµæã»ãã使ãã«ã¯ãæåã«ãèªåã®My::DBIC::Schema::CDã¯ã©ã¹ã®ä¸ã§ã -DBIx::Classã«ãã®ã¤ã³ã¹ã¿ã³ã¹ãä½ãããã«æãã¾ãã +自分の結果セット使うには、最初に、自分のMy::DBIC::Schema::CDクラスの中で、 +DBIx::Classにそのインスタンスを作るように教えます。 __PACKAGE__->resultset_class('My::DBIC::ResultSet::CD'); Then call your new method in your code: -ãããããã³ã¼ãã®ä¸ã§ãæ°ããå£ç½ã£åº¦ãå¼ã³ã¾ã: +それから、コードの中で、新しい壊疽っ度を呼びます: my $ordered_cds = $schema->resultset('CD')->search_cds_ordered(); -=head3 ResultSetã¯ã©ã¹ãæ¸ãããªããå ã«å®ç¾©ãããæ¤ç´¢ +=head3 ResultSetクラスを書かかない、先に定義された検索 Alternatively you can automatically generate a DBIx::Class::ResultSet class by using the ResultSetManager component and tagging your method as ResultSet: -å¥ã®ããããã¨ãã¦ãResultSetManagerã³ã³ãã¼ãã³ãã使ããResultSetã¨ã㦠-èªåã®ã¡ã½ãããã¿ã®ã³ã°ãããã¨ã§ãDBIx::Class::ResultSetã¯ã©ã¹ãèªåçã«ä½ãã¾ãã +別のやりかたとして、ResultSetManagerコンポーネントを使い、ResultSetとして +自分のメソッドをタギングすることで、DBIx::Class::ResultSetクラスを自動的に作れます。 __PACKAGE__->load_components(qw/ ResultSetManager Core /); @@ -291,19 +291,19 @@ Then call your method in the same way from your code: -ããã§ãã³ã¼ãããåãæ¹æ³ã§å¼ã¹ã¾ã: +これで、コードから同じ方法で呼べます: my $ordered_cds = $schema->resultset('CD')->search_cds_ordered(); -=head2 joins 㨠prefetch ã使ã +=head2 joins と prefetch を使う You can use the C<join> attribute to allow searching on, or sorting your results by, one or more columns in a related table. To return all CDs matching a particular artist name: -C<join>å±æ§ã使ã£ã¦ãé¢é£ãããã¼ãã«ã®1ã¤ä»¥ä¸ã®ã«ã©ã ã使ã£ã¦ã -æ¤ç´¢ããçµæã®ã½ã¼ããã§ãã¾ããç¹å®ã®ã¢ã¼ãã£ã¹ãåã®å ¨ã¦ã®CDã -è¿ãããã«ã¯: +C<join>属性を使って、関連するテーブルの1つ以上のカラムを使って、 +検索や、結果のソートができます。特定のアーティスト名の全てのCDを +返すためには: my $rs = $schema->resultset('CD')->search( { @@ -322,8 +322,8 @@ If required, you can now sort on any column in the related tables by including it in your C<order_by> attribute: -å¿ è¦ãªããC<order_by>å±æ§ã«ãããå«ãã¦ãé¢é£ãããã¼ãã«ã®ããããã®ã«ã©ã 㧠-ã½ã¼ãæºããã¨ãåºæ¥ã¾ãã +必要なら、C<order_by>属性にそれを含めて、関連するテーブルのいずれかのカラムで +ソート摺ることも出来ます。 my $rs = $schema->resultset('CD')->search( { @@ -345,16 +345,16 @@ sort using columns in a related table. Joining related tables when you only need columns from the main table will make performance worse! -C<join>å±æ§ã¯é¢é£ãããã¼ãã«ã®ã«ã©ã ã使ã£ã¦æ¤ç´¢ãã½ã¼ããããå¿ è¦ãããã¨ãã«ã®ã¿ -使ãããã¹ãã ã¨ãããã¨ã«æ³¨æãã¦ãã ããã -ã¡ã¤ã³ã®ãã¼ãã«ããã«ã©ã ãå¿ è¦ãªã¨ãã«ãé¢é£ãããã¼ãã«ãçµåããã®ã¯ã -ããã©ã¼ãã³ã¹ãæªãã§ã! +C<join>属性は関連するテーブルのカラムを使って検索やソートをする必要があるときにのみ +使われるべきだということに注意してください。 +メインのテーブルからカラムが必要なときに、関連するテーブルを結合するのは、 +パフォーマンスが悪いです! Now let's say you want to display a list of CDs, each with the name of the artist. The following will work fine: -ã§ããCDã®ãªã¹ãããããããã®ã¢ã¼ãã£ã¹ãã®ååã¨ä¸ç·ã«è¡¨ç¤ºãããã¨ãã¾ãããã -ä¸è¨ã®ããããã§ãã¾ãããã¾ã: +で、、CDのリストを、それぞれのアーティストの名前と一緒に表示したいとしましょう。 +下記のやりかたでうまくいきます: while (my $cd = $rs->next) { print "CD: " . $cd->title . ", Artist: " . $cd->artist->name; @@ -365,9 +365,9 @@ the artist name for any of the CD objects returned, L<DBIx::Class> will go back to the database: -ã§ãããä¸ã¤åé¡ãããã¾ãããã®ã¡ã¤ã³ã¯ã¨ãªã§ãC<cd>ã¨C<artist>ãã¼ãã«ã®ä¸¡æ¹ã -æ¤ç´¢ãã¦ãã¾ãããC<cd>ããã®ã¿ãã¼ã¿ãè¿ããã¦ãã¾ããè¿ãããCDãªãã¸ã§ã¯ãã®ä¸é¨ã§ã -ã¢ã¼ãã£ã¹ãåãå¾ãããã«ãL<DBIx::Class>ã¯ããã¼ã¿ãã¼ã¹ã«æ»ãã¾ã: +ですが、一つ問題があります。このメインクエリで、C<cd>とC<artist>テーブルの両方を +検索していますが、C<cd>からのみデータが返されています。返されたCDオブジェクトの一部で、 +アーティスト名を得るために、L<DBIx::Class>は、データベースに戻ります: SELECT artist.* FROM artist WHERE artist.id = ? @@ -375,15 +375,15 @@ main query. Five CDs, five extra queries. A hundred CDs, one hundred extra queries! -ä¸è¨ã®ãããªã¹ãã¼ãã¡ã³ãããã¡ã¤ã³ã¯ã¨ãªã«ãã£ã¦è¿ããããããããã®ãå ¨ã¦ã® -CDã§èµ°ãã¾ãã5ã¤ã®CDã§ããã°ã5ã¤ã®å¥ã®ã¯ã¨ãªã§ãã100ã®CDã§ããã°ã100ã®å¥ã® -ã¯ã¨ãª! +上記のようなステートメントが、メインクエリによって返された、それぞれの、全ての +CDで走ります。5つのCDであれば、5つの別のクエリです。100のCDであれば、100の別の +クエリ! Thankfully, L<DBIx::Class> has a C<prefetch> attribute to solve this problem. This allows you to fetch results from related tables in advance: -ããããããã¨ã«ãL<DBIx::Class>ã¯ãC<prefetch>å±æ§ãããããã®åé¡ã解決ã§ãã¾ãã -ãã®å±æ§ã使ãã¨ãå ã«é¢é£ãããã¼ãã«ããçµæãã¨ã£ã¦ããã¾ã: +ありがたいことに、L<DBIx::Class>は、C<prefetch>属性があり、この問題を解決できます。 +この属性を使うと、先に関連するテーブルから結果をとってこれます: my $rs = $schema->resultset('CD')->search( @@ -405,7 +405,7 @@ The code to print the CD list remains the same: -CDã®ãªã¹ãã表示ããã³ã¼ãã¯åãç©ã使ãã¾ã: +CDのリストを表示するコードは同じ物が使えます: while (my $cd = $rs->next) { print "CD: " . $cd->title . ", Artist: " . $cd->artist->name; @@ -415,33 +415,33 @@ so no additional SQL statements are executed. You now have a much more efficient query. -L<DBIx::Class>ã¯C<artist>ãã¼ãã«ãããã¹ã¦ã®ããããããã¼ã¿ãå ã«ã¨ã£ã¦ãã¦ãã¾ãã -ãã®ãããä½åãªSQLã¹ãã¼ãã¡ã³ãã¯å®è¡ããã¾ãããããå¹ççãªã¯ã¨ãªã«ãªãã¾ããã +L<DBIx::Class>はC<artist>テーブルからすべてのマッチするデータを先にとってきています。 +そのため、余分なSQLステートメントは実行されません。より効率的なクエリになりました。 Note that as of L<DBIx::Class> 0.05999_01, C<prefetch> I<can> be used with C<has_many> relationships. -L<DBIx::Class> 0.05999_01ã®è¾å ¸ã§ã C<has_many>ã®ãªã¬ã¼ã·ã§ã³ã·ããã§ã -C<prefetch>ãI<使ã>ãã®ã«æ³¨æãã¦ãã ããã +L<DBIx::Class> 0.05999_01の辞典で、 C<has_many>のリレーションシップで、 +C<prefetch>をI<使え>たのに注意してください。 Also note that C<prefetch> should only be used when you know you will definitely use data from a related table. Pre-fetching related tables when you only need columns from the main table will make performance worse! -ã¾ããC<prefetch>ã¯ãé¢é£ãããã¼ãã«ãããã¼ã¿ãå¿ ã使ãã¨ããã£ã¦ããã¨ãã®ã¿ã«ã -使ãã¹ãã§ããã¡ã¤ã³ãã¼ãã«ããã®ã«ã©ã ããå¿ è¦ã¨ããªããªãã -é¢é£ãããã¼ãã«ããå ã«åå¾ããã®ã¯ãããã©ã¼ãã³ã¹ãæªããã¾ã! +また、C<prefetch>は、関連するテーブルからデータを必ず使うとわかっているときのみに、 +使うべきです。メインテーブルからのカラムしか必要としないなら、 +関連するテーブルから先に取得するのは、パフォーマンスを悪くします! -=head3 ãã«ãã¹ãããã®çµå(join) +=head3 マルチステップの結合(join) Sometimes you want to join more than one relationship deep. In this example, we want to find all C<Artist> objects who have C<CD>s whose C<LinerNotes> contain a specific string: -ã²ã¨ã¤ä»¥ä¸ã®æ·±ããªã¬ã¼ã·ã§ã³ã·ããã§joinãããã¨ããããã§ãããã -ãã®ä¾ã§ã¯ãC<LinerNotes>ã«ç¹å®ã®æåãå«ã¾ããC<CD>ãæã£ã¦ããã -C<Artist>ãªãã¸ã§ã¯ããæ¢ãããã¨ãã¾ã: +ひとつ以上の深いリレーションシップでjoinしたいときもあるでしょう。 +この例では、C<LinerNotes>に特定の文字が含まれるC<CD>を持っている、 +C<Artist>オブジェクトを探したいとします: # Relationships defined elsewhere: # Artist->has_many('cds' => 'CD', 'artist'); @@ -468,8 +468,8 @@ want to reduce the number of Artists returned based on who wrote the liner notes: -çµåã¯ä»»æã®ã¬ãã«ã§ãã¹ãã§ãã¾ããã§ãã®ã§ãå¾ãããã©ã¤ãã¼ãã¼ãã -誰ãæ¸ããããå ã«ãè¿ãããã¢ã¼ãã£ã¹ãã®æ°ãæ¸ããããã¨æ±ºããã¨ããã: +結合は任意のレベルでネストできます。ですので、後から、ライナーノーツを +誰が書いたかを元に、返されるアーティストの数を減らしたいと決めたとしたら: # Relationship defined elsewhere: # LinerNotes->belongs_to('author' => 'Person'); @@ -496,13 +496,13 @@ # WHERE liner_notes.notes LIKE '%some text%' # AND author.name = 'A. Writer' -=head2 ãã«ãã¹ãããã®prefetch +=head2 マルチステップのprefetch From 0.04999_05 onwards, C<prefetch> can be nested more than one relationship deep using the same syntax as a multi-step join: -0.04999_05以åãããC<prefetch>ã¯ããã«ãã¹ãããã®çµåã¨åãã·ã³ã¿ãã¯ã¹ã§ã -ä¸ã¤ä»¥ä¸ã®æ·±ããªã¬ã¼ã·ã§ã³ã·ããã§ãã¹ãã§ãã¾ãã: +0.04999_05以前から、C<prefetch>は、マルチステップの結合と同じシンタックスで、 +一つ以上の深いリレーションシップでネストできました: my $rs = $schema->resultset('Tag')->search( {}, @@ -522,8 +522,8 @@ SQL statements: -ããã§ãC<cd>ã¨C<artist>ã®ãªã¬ã¼ã·ã§ã³ã·ããã«ã¢ã¯ã»ã¹ããã®ã«ã -追å ã®SQLã¹ãã¼ãã¡ã³ãã¯å¿ è¦ããã¾ãã: +これで、C<cd>とC<artist>のリレーションシップにアクセスするのに、 +追加のSQLステートメントは必要ありません: my $tag = $rs->first; print $tag->cd->artist->name; @@ -533,8 +533,8 @@ If you want to find the sum of a particular column there are several ways, the obvious one is to use search: -ç¹å®ã®ã«ã©ã ã®åè¨ãæ¢ããããã°ãããã¤ãã®æ¹æ³ãããã¾ããèªæã®ãã®ã¨ãã¦ã¯ã -searchã使ããã®ã§ã: +特定のカラムの合計を探したければ、いくつもの方法があります。自明のものとしては、 +searchを使うものです: my $rs = $schema->resultset('Items')->search( {}, @@ -549,23 +549,23 @@ returned when you ask the C<ResultSet> for a column using C<get_column>: -ãããã¯ãL<DBIx::Class::ResultSetColumn>ã使ããã¨ãåºæ¥ã¾ãã -ããã¯ãC<ResultSet>ã§C<get_column>ã使ã£ã¦ã«ã©ã ãåãã¨ãã« -è¿ããããã®ãåãã¾ãã +もしくは、L<DBIx::Class::ResultSetColumn>を使うことも出来ます。 +これは、C<ResultSet>でC<get_column>を使ってカラムを取るときに +返されるものが取れます。 my $cost = $schema->resultset('Items')->get_column('Cost'); my $tc = $cost->sum; With this you can also do: -ãããã次ã®ããã«ã§ãã¾ã: +これを、次のようにできます: my $minvalue = $cost->min; my $maxvalue = $cost->max; Or just iterate through the values of this column only: -ã¾ãã¯ããã®ã«ã©ã ã®å¤ã®ã¿ãéãã¦ã¤ãã¬ã¼ããã¾ã: +または、このカラムの値のみを通してイテレートします: while ( my $c = $cost->next ) { print $c; @@ -579,66 +579,66 @@ you need one that it doesn't have, then you can use the C<func> method instead: -C<ResultSetColumn>ã¯å°ãã ããã«ãã¤ã³ã®é¢æ°ãããã¾ãã -ããã«ãªããã®ãå¿ è¦ãªããC<func>ã¡ã½ãããå¤ããã«ä½¿ããã¨ãã§ãã¾ã: +C<ResultSetColumn>は少しだけビルトインの関数があります。 +これにないものが必要なら、C<func>メソッドを変わりに使うことができます: my $avg = $cost->func('AVERAGE'); This will cause the following SQL statement to be run: -ããããã¨ãä¸è¨ã®SQLã¹ãã¼ãã¡ã³ããèµ°ãã¾ã: +こうすると、下記のSQLステートメントが走ります: SELECT AVERAGE(Cost) FROM Items me Which will of course only work if your database supports this function. See L<DBIx::Class::ResultSetColumn> for more documentation. -ãã¡ããã使ã£ã¦ãããã¼ã¿ãã¼ã¹ããã®é¢æ°ããµãã¼ããã¦ããªããã°ããã¾ããã -ãã詳ããã¯ãL<DBIx::Class::ResultSetColumn>ãã¿ã¦ãã ããã +もちろん、使っているデータベースがこの関数をサポートしていなければいけません。 +より詳しくは、L<DBIx::Class::ResultSetColumn>をみてください。 -=head2 ãªã¬ã¼ã·ã§ã³ã·ããã使ã +=head2 リレーションシップを使う -=head3 é¢é£ãããã¼ãã«ã«æ°ããåãä½ã +=head3 関連するテーブルに新しい列を作る my $book->create_related('author', { name => 'Fred'}); -=head3 é¢é£ãããã¼ãã«ãæ¤ç´¢ãã +=head3 関連するテーブルを検索する Only searches for books named 'Titanic' by the author in $author. -$autorã®èè ã§ã'Titanic'ã¨ããååã®æ¬ã ããæ¤ç´¢ãããã +$autorの著者で、'Titanic'という名前の本だけを検索したい。 my $author->search_related('books', { name => 'Titanic' }); -=head3 é¢é£ãããã¼ãã«ã®ãã¼ã¿ãåé¤ãã +=head3 関連するテーブルのデータを削除する Deletes only the book named Titanic by the author in $author. -$autorã®èè ã§ãTitanicã¨ããååã®æ¬ã ããåé¤ãããã +$autorの著者で、Titanicという名前の本だけを削除したい。 my $author->delete_related('books', { name => 'Titanic' }); -=head3 é¢ä¿ããçµæã»ããã®é åºä»ã +=head3 関係する結果セットの順序付け If you always want a relation to be ordered, you can specify this when you create the relationship. -é åºä»ããããé¢ä¿ã常ã«ã»ãããªãããªã¬ã¼ã·ã§ã³ã·ãããä½ãã¨ãã«ã次ã®æå®ãã§ãã¾ãã +順序付けられた関係が常にほしいなら、リレーションシップを作るときに、次の指定をできます。 To order C<< $book->pages >> by descending page_number. -page_numberãéé ã§ãC<< $book->pages >>ã並ã³å¤ããããªãã +page_numberを降順で、C<< $book->pages >>を並び変えたいなら。 Book->has_many('pages' => 'Page', 'book', { order_by => \'page_number DESC'} ); -=head2 ãã©ã³ã¶ã¯ã·ã§ã³ +=head2 トランザクション As of version 0.04001, there is improved transaction support in L<DBIx::Class::Storage::DBI> and L<DBIx::Class::Schema>. Here is an example of the recommended way to use it: -0.04001以åã«ã L<DBIx::Class::Storage::DBI>ã¨L<DBIx::Class::Schema>ã«ãæ¹è¯ããã -ãã©ã³ã¶ã¯ã·ã§ã³ãµãã¼ããããã¾ããããã使ãæ¨å¥¨ãããæ¹æ³ã®ä¸ä¾ã§ã: +0.04001以前に、 L<DBIx::Class::Storage::DBI>とL<DBIx::Class::Schema>に、改良された +トランザクションサポートがあります。これを使う推奨される方法の一例です: my $genus = $schema->resultset('Genus')->find(12); @@ -674,17 +674,17 @@ transactions (for databases that support them) will hopefully be added in the future. -ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã¯æå¾ ã©ããã«åãã¾ãã -ä¸çªå¤å´ã®ãã©ã³ã¶ã¯ã·ã§ã³ã ããå®éã«$dbhã«ã³ããããçºè¡ãã¾ãã -ã©ã®ã¬ãã«ã®ã©ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ãããã¼ã«ããã¯ãããã -å ¨ã¦ã®ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã失æãã¾ãã -ã»ã¼ããã¤ã³ãã¨ãæ¬å½ã«ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ -(ããããµãã¼ããã¦ãããã¼ã¿ãã¼ã¹ç¨ã«)ã¯ãå°æ¥ããã¾ãããã°ã追å ãããã§ãããã +ネストされたトランザクションは期待どおりに動きます。 +一番外側のトランザクションだけが実際に$dbhにコミットを発行します。 +どのレベルのどのトランザクションでも、ロールバックしたら、 +全てのネストされたトランザクションが失敗します。 +セーブポイントと、本当にネストされたトランザクション +(それをサポートしているデータベース用に)は、将来、うまくいけば、追加されるでしょう。 -=head2 Many-to-many ã®ãªã¬ã¼ã·ã§ã³ã·ãã +=head2 Many-to-many のリレーションシップ This is straightforward using L<ManyToMany|DBIx::Class::Relationship/many_to_many>: -ããã¯ãåç´ã«L<ManyToMany|DBIx::Class::Relationship/many_to_many>ã使ãã¾ã: +これは、単純にL<ManyToMany|DBIx::Class::Relationship/many_to_many>を使います: package My::DB; # ... set up connection ... @@ -716,13 +716,13 @@ $rs = $user->addresses(); # get all addresses for a user $rs = $address->users(); # get all users for an address -=head2 åã®ããã©ã«ãã®å¤ãç¨æãã +=head2 列のデフォルトの値を用意する It's as simple as overriding the C<new> method. Note the use of C<next::method>. -åç´ã«ãC<new>ã¡ã½ããããªã¼ãã¼ã©ã¤ããã¾ãã -C<next::method>ã®ä½¿ãããã«æ³¨æãã¦ãã ããã +単純に、C<new>メソッドをオーバーライドします。 +C<next::method>の使いかたに注意してください。 sub new { my ( $self, $attrs ) = @_; @@ -738,67 +738,67 @@ documentation. See also L<DBIx::Class::Manual::Component> for more ways to write your own base classes to do this. -C<next::method>ã«ã¤ãã¦ãã詳ããã¯ãL<Class::C3>ã®ããã¥ã¡ã³ããåç §ãã¦ãã ããã -ãããããããã®ãèªåèªèº«ã®ãã¼ã¹ã¯ã©ã¹ãæ¸ãããã®ãããå¤ãã®æ¹æ³ã«ã¤ãã¦ã¯ã -L<DBIx::CLass::Manual::Component>ãè¦ã¦ãã ããã +C<next::method>についてより詳しくは、L<Class::C3>のドキュメントを参照してください。 +これをするための、自分自身のベースクラスを書くための、より多くの方法については、 +L<DBIx::CLass::Manual::Component>を見てください。 People looking for ways to do "triggers" with DBIx::Class are probably just looking for this. -DBIx::Classã§"triggers"ãããæ¹æ³ãæ¢ãã¦ãã人ãããããæ¢ãã¦ããã§ãããã +DBIx::Classで"triggers"をする方法を探している人も、これを探しているでしょう。 =head2 Stringification Employ the standard stringification technique by using the C<overload> module. -C<overload> ã¢ã¸ã¥ã¼ã«ã§æ¨æºçãªæåååã®ãã¯ããã¯ã使ãã¾ãã +C<overload> モジュールで標準的な文字列化のテクニックを使えます。 To make an object stringify itself as a single column, use something like this (replace C<foo> with the column/method of your choice): -ã²ã¨ã¤ã®ã«ã©ã ã«ã¤ãã¦ããªãã¸ã§ã¯ãèªèº«ãæåååããã«ã¯ã -次ã®ããã«ãã¾ãã(ã«ã©ã /ã¡ã½ããã§C<foo>ãç½®ãæãã¦ãã ãã) +ひとつのカラムについて、オブジェクト自身を文字列化するには、 +次のようにします。(カラム/メソッドでC<foo>を置き換えてください) use overload '""' => sub { shift->name}, fallback => 1; For more complex stringification, you can use an anonymous subroutine: -ããè¤éãªæåååã§ã¯ãç¡åãµãã«ã¼ãã³ã使ãã¾ã: +より複雑な文字列化では、無名サブルーチンを使えます: use overload '""' => sub { $_[0]->name . ", " . $_[0]->address }, fallback => 1; -=head3 æåååã®ä¾ +=head3 文字列化の例 Suppose we have two tables: C<Product> and C<Category>. The table specifications are: -äºã¤ã®ãã¼ãã«ãããã¨ãã¾ã:C<Product>ã¨C<Cateogry>ã -ãã¼ãã«ã®å®ç¾©ã¯æ¬¡ã®éã: +二つのテーブルがあるとします:C<Product>とC<Cateogry>。 +テーブルの定義は次の通り: Product(id, Description, category) Category(id, Description) C<category> is a foreign key into the Category table. -C<category>ã¯Categoryãã¼ãã«ã®å¤é¨ãã¼ã§ãã +C<category>はCategoryテーブルの外部キーです。 If you have a Product object C<$obj> and write something like -Productãªãã¸ã§ã¯ãC<$obj>ãããã次ã®ããã«æ¸ããã¨ããã¨ã +ProductオブジェクトC<$obj>があり、次のように書いたとすると、 print $obj->category things will not work as expected. -æå¾ ã©ããã«ã¯åãã¾ããã +期待どおりには動きません。 To obtain, for example, the category description, you should add this method to the class defining the Category table: -ã«ãã´ãªã®å 容ãå¾ãããªããä¾ãã°ãCategoryãã¼ãã«ã®ã¯ã©ã¹å®ç¾©ã«æ¬¡ã® -ã¡ã½ããã追å ãã¹ãã§ã: +カテゴリの内容を得たいなら、例えば、Categoryテーブルのクラス定義に次の +メソッドを追加すべきです: use overload "" => sub { my $self = shift; @@ -806,31 +806,31 @@ return $self->Description; }, fallback => 1; -=head2 ãããã«åæ +=head2 きれいに切断 If you find yourself quitting an app with Control-C a lot during development, you might like to put the following signal handler in your main database class to make sure it disconnects cleanly: -éçºä¸ã«ãCotrol-Cãå¤ç¨ãã¦ãã¢ããªã±ã¼ã·ã§ã³ãçµäºããããã¨ã -å¤ããªããä¸è¨ã®ãããªã·ã°ãã«ãã³ãã©ã¼ããã¼ã¿ãã¼ã¹ã¯ã©ã¹ã«ç½®ãã¦ã -確å®ã«ãããã«åæãããããããã¾ãã: +開発中に、Cotrol-Cを多用して、アプリケーションを終了させることが +多いなら、下記のようなシグナルハンドラーをデータベースクラスに置いて、 +確実にきれいに切断したいかもしれません: $SIG{INT} = sub { __PACKAGE__->storage->disconnect; }; -=head2 ã¹ãã¼ãã®ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ã +=head2 スキーマのインポート/エクスポート This functionality requires you to have L<SQL::Translator> (also known as "SQL Fairy") installed. -ãã®æ©è½ã使ãã«ã¯ãL<SQL::Translator>("SQL Fairy"ã¨ãç¥ããã)ã -ã¤ã³ã¹ãã¼ã«ããå¿ è¦ãããã¾ãã +この機能を使うには、L<SQL::Translator>("SQL Fairy"とも知られる)を +インストールする必要があります。 To create a DBIx::Class schema from an existing database: -DBIx::Classã¹ãã¼ããæ¢åã®ãã¼ã¿ãã¼ã¹ããä½ãã¾ã: +DBIx::Classスキーマを既存のデータベースから作ります: sqlt --from DBI --to DBIx::Class::File @@ -839,8 +839,8 @@ To create a MySQL database from an existing L<DBIx::Class> schema, convert the schema to MySQL's dialect of SQL: -MySQLãã¼ã¿ãã¼ã¹ãæ¢åã®L<DBIx::Class>ã¹ãã¼ãããä½ãã¾ãã -ã¹ãã¼ããMySQLã®SQLæ¾è¨ã«å¤æãã¾ã: +MySQLデータベースを既存のL<DBIx::Class>スキーマから作ります。 +スキーマをMySQLのSQL放言に変換します: sqlt --from SQL::Translator::Parser::DBIx::Class --to MySQL @@ -848,22 +848,21 @@ And import using the mysql client: -mysqlã¯ã©ã¤ã¢ã³ãã§importãã¾ã: +mysqlクライアントでimportします: mysql -h "host" -D "database" -u "user" -p < Schema1.sql -=head2 ã¯ã©ã¹ãã¼ã¹ããã¹ãã¼ããã¼ã¹ã®ã»ããã¢ããã¸ã®ç°¡åãªç§»è¡ +=head2 クラスベースからスキーマペースのセットアップへの簡単な移行 You want to start using the schema-based approach to L<DBIx::Class> (see L<SchemaIntro.pod>), but have an established class-based setup with lots of existing classes that you don't want to move by hand. Try this nifty script instead: -L<DBIx::Class>ã¸ã®ã¹ãã¼ããã¼ã¹ã®ã¢ããã¼ãã使ããã(L<SchemaIntro.pod>ãã¿ã¦ãã ãã)ã -ã§ããæ¢åã®å¤§éã®ã¯ã©ã¹ã§ãå¾æ¥ã®ã¯ã©ã¹ãã¼ã¹ã®ã»ããã¢ãããããã -æã§ããããåããããã¯ãªãã¨ãã¾ããæã§åããå¤ããã«ãä¸è¨ã®æ°ã®å©ããã¹ã¯ãªããã -試ãã¦ã¿ã¦ä¸ãã: - +L<DBIx::Class>へのスキーマベースのアプローチを使いたい(L<SchemaIntro.pod>をみてください)、 +でも、既存の大量のクラスで、従来のクラスベースのセットアップがあり、 +手でそれらを動かしたくはないとします。手で動かす変わりに、下記の気の利いたスクリプトを +試してみて下さい: use MyDB; @@ -897,17 +896,17 @@ You could use L<Module::Find> to search for all subclasses in the MyDB::* namespace, which is currently left as an exercise for the reader. -L<Module::Find>ã使ã£ã¦ãMyDB::*åå空éã«ããå ¨ã¦ã®ãµãã¯ã©ã¹ãæ¢ããã¨ãåºæ¥ã¾ããã -ããã¯ãä»ã®ã¨ãããèªè ã¸ã®èª²é¡ã¨ãã¦ããã¾ãã +L<Module::Find>を使って、MyDB::*名前空間にある全てのサブクラスを探すことが出来ますが、 +これは、今のところ、読者への課題としておきます。 -=head2 ã¹ãã¼ãã®ãã¼ã¸ã§ãã³ã° +=head2 スキーマのバージョニング The following example shows simplistically how you might use DBIx::Class to deploy versioned schemas to your customers. The basic process is as follows: -ä¸è¨ã®ä¾ã§ã¯ãDBIx::Classã使ã£ã¦ã顧客åãã«ãã¼ã¸ã§ã³ä»ãã®ã¹ãã¼ããã©ããã£ã¦ -ãããã¤ãããããè¦ããã¾ãã +下記の例では、DBIx::Classを使って、顧客向けにバージョン付きのスキーマをどうやって +デプロイするかをお見せします。 =over 4 @@ -915,49 +914,49 @@ Create a DBIx::Class schema -DBIx::Classã¹ãã¼ããä½ãã¾ã +DBIx::Classスキーマを作ります =item 2. Save the schema -ã¹ãã¼ããä¿åãã¾ã +スキーマを保存します =item 3. Deploy to customers -顧客ã«ãããã¤ãã¾ã +顧客にデプロイします =item 4. Modify schema to change functionality -ã¹ãã¼ããå¤æ´ãã¦ã functionality ãå¤æ´ãã¾ã +スキーマを変更して、 functionality を変更します =item 5. Deploy update to customers -顧客ã«æ´æ°ããããã¤ãã¾ã +顧客に更新をデプロイします =back -=head3 DBIx::Calssã¹ãã¼ããä½ã +=head3 DBIx::Calssスキーマを作る This can either be done manually, or generated from an existing database as described under C<Schema import/export>. -ããã¯ãæã§è¡ããã¨ããC<Schema import/export>ã§èª¬æãã¾ããã -æ¢åã®ãã¼ã¿ãã¼ã¹ããçæãããã¨ãã§ãã¾ãã +これは、手で行うことも、C<Schema import/export>で説明しますが、 +既存のデータベースから生成することもできます。 -=head3 ã¹ãã¼ããä¿åãã +=head3 スキーマを保存する Use C<sqlt> to transform your schema into an SQL script suitable for your customer's database. E.g. for MySQL: -C<sqlt>ã使ã£ã¦ãã¹ãã¼ããå¤æãã¦ã顧客ã®ãã¼ã¿ãã¼ã¹(ä¾ãã°ãMySQL)ã«åã£ãã -SQLã¹ã¯ãªããã«ãã¾ãã +C<sqlt>を使って、スキーマを変換して、顧客のデータベース(例えば、MySQL)に合った、 +SQLスクリプトにします。 sqlt --from SQL::Translator::Parser::DBIx::Class --to MySQL @@ -966,20 +965,20 @@ If you need to target databases from multiple vendors, just generate an SQL script suitable for each. To support PostgreSQL too: -è¤æ°ã®ãã³ããããã¼ãã¼ã¹ãã¿ã¼ã²ããã«ããªããã°ãªããªããªãã -ããããã«åã£ãSQLã¹ã¯ãªãããçæããã ãã§ããPostgreSQLããµãã¼ããã¦ãã¾ã: +複数のベンダからデーベースをターゲットにしなければならないなら、 +それぞれに合ったSQLスクリプトを生成するだけです。PostgreSQLもサポートしています: sqlt --from SQL::Translator::DBIx::Class --to PostgreSQL --DBIx::Class "MySchema.pm" > Schema1.pgsql.sql -=head3 顧客ã«ãããã¤ãã +=head3 顧客にデプロイする There are several ways you could deploy your schema. These are probably beyond the scope of this recipe, but might include: -ã¹ãã¼ãããããã¤ããã®ã«ã¯è¤æ°ã®æ¹æ³ãããã¾ãã -ãã®ã¬ã·ãã®ã¹ã³ã¼ããé¸è±ãã¦ãããã§ãããå«ãã¦ããã¾ã: +スキーマをデプロイするのには複数の方法があります。 +このレシピの範疇を越えそうですが、含めておきます: =over 4 @@ -1423,6 +1422,16 @@ return $self->generate_description; } +=head1 翻訳について -=cut +翻訳者:加藤敦 (ktat.****@gmail*****) + +Perlドキュメント日本語訳 Project にて、 +Perlモジュール、ドキュメントの翻訳を行っております。 + http://perldocjp.sourceforge.jp/ + http://sourceforge.jp/projects/perldocjp/ + http://www.freeml.com/ctrl/html/MLInfoForm/perld****@freem***** + http://www.perldoc.jp + +=cut