DBICのバージョンを最新にしてやるぜ!と思いごりっと入れてみた。 プロジェクトで使ってたバージョンは確か0.00400かな。 まず、Module::Buildが最新じゃなかったのでエラー祭り。 うがー。 Module::Buildを最新にしたら問題なくインストール完了。 とあるプロジェクトで使ってたので動作確認してたらうごかねー。 CRUDのCがうごかねー。 それ以外は問題なさげ。 調べたところDBIC::RandomStringColumnsで無限ループしてた。 sub get_random_string { my $self = shift; my $column = shift; my $val; do { # must be unique $val = String::Random->new->randregex(sprintf('%s{%d}', $self->rs_solt-
とっても便利なDBIx::Class::InflateColumn::DateTimeですが、前にも書いたとおり作成日時、更新日時などの設定が面倒です。 LyoさんのDBIx::Class::DateTimeColumnsはその辺がRails likeになっていてお気に入りだったので取り込んで見ました。 package DBIx::Class::InflateColumn::DateTime::Auto; use strict; use warnings; our $VERSION = '0.01'; use base qw/DBIx::Class::InflateColumn::DateTime/; use DateTime; __PACKAGE__->mk_classdata( datetime_timezone => 'local' ); __PACKAGE__->mk_classd
DBIx::ClassでmysqlのFULLTEXTインデックスに対する検索をより美しく使うにはどうすればいいかなぁ、と考えた結果search_literalを使えば良いかと思い立った次第です。 こんなテーブルで CREATE TABLE table01 ( id INT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY(id), title VARCHAR(255), artist VARCHAR(255), review TEXT, FULLTEXT(review) ); Schemaを作って、こんな感じに走らせると use strict; use warnings; use CD::Schema; my $schema = CD::Schema->connection('dbi:mysql:cd', 'user', 'password');
DBIC のスキーマをたくさん(20数個かな)定義したモジュールを use しただけの単純なスクリプトに DProf によるプロファイラをかけてみました。 Algorithm::C3 0.01 時代のプロファイリングがこれ。 Total Elapsed Time = 9.335981 Seconds User+System Time = 9.315981 Seconds Exclusive Times %Time ExclSec CumulS #Calls sec/call Csec/c Name 58.3 5.436 5.436 18829 0.0003 0.0003 Algorithm::C3::_merge 21.4 1.995 7.823 491 0.0041 0.0159 Class::C3::_calculate_method_dispa tch_table 9.95 0.92
DBIx::Class 0.07がリリースされました [Dbix-class] Announce: DBIx-Class-0.07 - Added InflateColumn::DateTime to auto create DateTime objects using the appropriate DateTime::Format::* classin a database agnostic way - Added ResultSetColumn to perform aggregate and other functions on specific resultset columns - Substantial refactor of ResultSet to to better handle more complex joins and improve efficiency -
DBIC のプラグイン機構は Class::C3 が使われています。これは何をするものかというと,多重継承したクラスでのメソッドの呼び出し順序を Perl 標準のではなくわりとメジャーな順序にするという…って自分でも何をいっているかわかりませんが,ともかくそれを使っているわけです。んで,前も書きましたけど DBIC で実装されたスキーマは読み込み時(use や require 時)にすごく時間がかかるわけですが,これはプロファイルとればわかるんですがその Class::C3 というか Algorithm::C3 部分のせいです。メソッド呼び出し順序を決定するために再帰をつかいまくっているんで呼び出され回数が膨大なことになっています。 で,噂によると高速化するパッチがあるらしいですが…はたしてどんなものだか。 暇ができたら Algorithm::C3::XS みたいなの書きたいなぁと思ってい
追記 2006/12/06 下記で IS NOT NULL を実現するのにスカラーリファレンスを使用していますが,IS NULL / IS NOT NULL を出すためには必ずしもスカラーリファレンスを利用する必要はありません。ということで訂正を入れようと思ったんですがちょっと長いので「フォローアップ記事」を書きました。 本題 typester さんに以前教えて頂いたんですが,似たようなことに今日遭遇したのでメモ。 WHERE field1 IS NOT NULL な検索をしようと思って, $resultset->search({ field1 => 'IS NOT NULL' });と書くと,内部的には SELECT ... WHERE field1 = ?と展開されて,プレースホルダに「IS NOT NULL」が渡されるので,バツ。 $resultset->search({ field
今まで $schema->storage->debug(1) として標準出力に出力される SQL 文を監視していたのですが,なぜか早く終わるリクエストでとらえきれなくなってしまいました。 やむなくロガーを導入することにしました。Log::Log4perl は仕様が重そうなので(log4j のときも設定とかめんどくさかったなぁ)パス。Log::Agent とかなかなか魅力的と思ったのですが,Log::Dispatch の設計思想にやや惹かれてこちらを使うことに…あ,Log::Log4perl ってこれをバックエンドにしてたんですか。作者の Dave Rolsky さんは DateTime のメンテナでもあるんですね。ふむふむ。 インストール自体はさっくり終了(というかテストスクリプトが簡潔すぎ)しました。DBIx::Class::Storage::DBI には debugcb というデバッグ
簡単ですね。 get_table_info.pl #!/usr/local/perl5.8.7/bin/perl use Data::Dumper; use DBIx::Class::Schema::Loader; my $tmp_pkg = 'Temp::Schema'; push @{$tmp_pkg . '::ISA'}, qw/DBIx::Class::Schema::Loader/; $tmp_pkg->loader_options(relationships => 1); my $c = $tmp_pkg->connect(@ARGV); my $mapping = $tmp_pkg->class_mappings; foreach my $k (keys %$mapping){ print Dumper({$k => [ {class => $mapping->{$k}},
Catalyst::Model::DBIC::Schema を使う。 この Model は大きく3つの使いかたがある。 単純に既に存在する Schema クラスを使用するSchema::Loader で既存の DB から Schema クラスを生成し、それを使用するSchema::Loader で既存の DB から Schema::Loader クラスを生成し、それを利用する。 1 はまず Schema クラスをどこかに作ってあり(My::Schemaと仮定する)、それをそのまま Catalyst::Model として利用する。 ./script/myapp_create.pl model DBIC DBIC::Schema My::Schema で、MyApp::Model::DBIC が作成される。この My::Schema に connection なんかが定義されていてそれを使う場
http://d.hatena.ne.jp/lestrrat/20060612#1150101567にて、id:lestrratさんが怒ってらっしゃるけど、 (それがどうかは別に)、ドキュメントはよろしくない。 Intro Cookbook Catalyst::Helper::DBIC::SchemaLoaderは存在しない。 WritingPlugins prepare の第一引数は クラス。 前者の話は、DBIx::Class::Schema::Loaderを使ったクラスを自分で書く (か、DBIx::Class::Schemaを使ってそれぞれのクラスを作る)必要がある。 package Hogehoge::Schema; use strict; use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options
DBICのメソッド拡張ですが、ResultSetManagerを使えばラクチンでした。 ResultSetManagerが王道になるのかな。 参考:http://blog.hide-k.net/archives/2006/03/dbixclassresult.php searchメソッド実行させるときにシングルクォートのエスケープさせたかったのですが、 Kittenでは例えばこんな感じ eval { $cap->stash->{memo} = __PACKAGE__->resultset('Memo')->search( { memo => {'like', '%'.&Kitten::Util::escapeDB($q->param('memo')).'%'} }, { page => $page, row => 10, order_by => 'id DESC', } ); }; &Ki
DBIx::Class にはいくつか興味深いモジュールがあります。 DBIx::Class::PK::Auto 標準で添付されているモジュールです。これについては以前書きました。 DBIx::Class::InflateColumn 標準で添付されているモジュールです。カラムデータとオブジェクト(たとえば DateTime クラスとか)を相互変換できるモジュールです。これを使うと CDBI の has_a で外部クラスを指定した時のようなことができるのかな? DBIx::Class::WebForm Data::FormValidator 等の結果をもとに,レコードを作成したり更新したり(CRUD)することができるモジュールみたいです。でも,実際にはフォームとテーブルが一対一対応してることなんて少ないと思います。ドキュメントも全然書いてないし。なので自分では使わないと思います。 DBIx:
DBIx::Class::Manual::DocMap をみてどんなドキュメントがあるのか知る。 DBIx::Class::Manual::Intro を読んで作法を知る。 DBIx::Class::Manual::Example を読んで雰囲気をつかむ。実際やってみる。 DBIx::Class::Manual::Troubleshooting にも書いてあるけど,実際にどんな SQL が発行されるのかは,デバッグモードにすればわかる。 $schema = MySchema->connect(...); したあとに,$schema->storage->debug(1); おもに 3 種類のレイヤがある。 テーブルスキーマを定義する DBIx::Class の継承クラス DBIx::Class::ResultSource のメソッドを使うとテーブル定義とかいろいろ調べられる。 ResultS
Catalyst の Model に Class::DBI でなくて DBIC 試してみようと思ったら、DBIx::Class::Loader::Oracle がないので Helper スクリプトがエラーになってしまいます。 script/test_create.pl model DBIC DBIC dbi:Oracle:testdb test test123 exists "/test/script/../lib/test/Model" exists "/test/script/../t" This module has been deprecated in favor of Catalyst::Model::DBIC::Schema at /usr/local/lib/perl5/site_perl/5.8.6/Catalyst/Helper/Model/DBIC.pm line 45
ActiveRecordなORマッピングはJavaのTorqueを大昔に触ったきりなのでこんな実装デザインが正しいのかどうかわかりませんが、DBIx::Classで package CD::Schema::Albums; use strict; use warnings; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/Core/); __PACKAGE__->table('albums'); __PACKAGE__->add_columns(qw/ id artist title /); __PACKAGE__->set_primary_key('id'); __PACKAGE__->belongs_to('artist' => 'CD::Schema::Artists'); __PACKAGE__->has_many(
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
VERSION-0.05000での記述。http://search.cpan.org/~mstrout/DBIx-Class/ ドキュメントも当初に比べれば増えてきたし、そっち見たほうがよかばい。 まあ以下は簡単なまとめで。一通り使えるくらいは書きたい。 このサイトはWikiなので途中途中に色々追加したり修正したりしますからご注意を DBIx::Class::Schemaを使ってみる これからDBICではSchemaメインらしい。 使うテーブル作成SQL create table user ( id int(10) NOT NULL auto_increment, name varchar(256) NOT NULL, PRIMARY KEY (id) ) ENGINE = InnoDB;
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く