The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package DBIx::Class::Storage::Statistics::Caller; use strict; use warnings; use base qw/ DBIx::Class::Storage::Statistics /; sub query_start { my ($self, $string, @bind) = @_; my $caller_sub_name = $self->_get_non_dbic_caller; my $message = "[$caller_sub_name] $string: ".join(', ', @bind)."\n"; if(defined($self->callback)) { $string =~ m/^(\w+)/; $self->callback->($1, $message); return; } $self->p
良くあるDBICのサンプルではDBIx::Class::Schema::load_classes()を使ってクラスのロードを行っています。 CD.pm package CD; use strict; use warnings; use base 'DBIx::Class::Schema'; __PACKAGE__->load_classes; 1; load_classes()はクラスを指定しないと CD Album Track という構成において自動的にクラスをロードすることができます。 ここでResultSetの拡張をしたいと考えます。例えば CD/ResultSet/Album.pm package CD::ResultSet::Album; use strict; use warnings; use base 'DBIx::Class::ResultSet'; sub search
トレース DBIx::Classで複雑なクエリを行っている場合、実際に発行されているクエリをみる必要がある場合があります。そのような場合は環境変数DBIC_TRACEを設定してスクリプトを実行すると実行されているクエリをみることができます: DBIC_TRACE=1 myscript.pl クエリが多くて一度に追うのが難しい場合はこの出力をファイルに向けることもできます。 DBIC_TRACE=1=/path/to/query.log myscript.pl トランザクション DBIx::Class 0.08100以上をお使いであれば、明示的に何も指定しなくてもDBIx::Class::Storage::TxnScopeGuardを使用することができます。 #!/usr/bin/perl use strict; use MyApp::Schema; my $schema = MyApp::
2009年05月19日02:17 Perl resultset_attributes を利用して、テーブルの alias を me から変更する with DBIC こんばんわ。ささたつです。ヾ(o゚ω゚o)ノ゙ 今日はDBICの話です。最近perlのO/RマッパーであるDBICを使っています。簡単なSQLだととても便利なんですが、複雑なSQLになると。。。すぐにスカラーリファレンスに頼ってしまいます(よね?><) さて、テーブルには delete_flag を必ず置くように設計していて、findとかsearchしたときに delete_flag = 0 をデフォルトの検索条件として利用するため、Schemaファイルにこのような設定を書いていました。 __PACKAGE__->resultset_attributes({ where => {delete_flag => 0} }); ただ
Intro to DBIx::Class In my opinion DBIx::Class is one of the best ORM solutions out there. Not only can it model your database, including mapping out any foreign key relationships, it can also be used as a canonical point of reference for your schema. This means we can use it not only as an application layer interface to the database, but can also define a versioned database structure using the
DBIx::Class::Validation - Validate all data before submitting to your database. - metacpan.org モデル層でValidationするモジュールなんだけど、単純にCatalystで使ってみたらイマイチだったのでメモ。 イマイチというのはコントローラが思いのほか汚くなってしまうということと、確認画面があるようなフォームだとモデル層に行く前(insert/updateする前、確認用アクション)でValidationすることになるので単純に使えないということです。また、特にtxn_doとか使うとevalばっかになって嫌な感じです。 sub create_save : Path('create/save') { my ($self, $c) = @_; if ($c->session->{entry}) {
DB周りのロジックテストをしたくて導入してみたのですが、リレーションがらみでcreate_relatedメソッドなんかを使ってると、create時にコケてしまうので、 --- Schema.pm 2008-05-10 14:39:59.000000000 +0900 +++ Schema.pm.new 2009-02-27 16:28:24.000000000 +0900 @@ -71,8 +71,7 @@ my $result = {}; for my $row ( @{ $fixture } ) { - $schema->resultset( $row->{schema} )->create( $row->{data} ); - $result->{ $row->{name} } = $schema->resultset( $row->{schema} )->find( $row->{
\mysql_enable_utf8 => 1 で DBIC::UTF8Columns 要らなくなるっぽい - 僕ト云フ事@はてな出張版 恥ずかしながら知りませんでした。 DBIx::Classの場合、DBIx::Class::UTF8Columnsを使ってutf8_columns()でUTF8フラグを立てたいカラムを指定するのですが、特定のカラムだけにUTF8フラグを立てるというのは稀で、全ての文字列のカラムに立てるのが多くの場合だと思います。 ので、DBDのレイヤーで吸収するこの方法が個人的にもベストプラクティスだと思います。 vkgtaro++ 備忘でまとめておくと各DBDの接続オプションで mysql: mysql_enable_utf8 postgresql: pg_enable_utf8 sqlite: unicode に1を指定することにより、全ての文字列のカラムの値にUTF
追記です コメントとブクマで今のところ experimental と書いてあるよ! と教えてもらいました。気づいてなかったです。id:nihen さん、コメントくれた人、ありがとう。 This option is experimental and may change in future versions. Catalyst::Wiki もこれ書いた方が良さそうですね。書けるのかな。 それにしても、DBD 側でできると良いに越したことないので、早く確定して欲しいですね! 追記2 あー、でもこれ、4.00からずっとこのままだ。かれこれ2年くらい experimental なんですがw Catalyst::Wiki に書いて来ちゃったけどw ここから元の内容 lyokato さん経由で woremacx さんに教えてもらった Using Unicode - Catalyst::Wiki に書い
prefetch & +asした場合は+asのターゲットを定められるよ グループ has_many ユーザーというのを例にします。 パスワードの長さを調べようと・・・ $schema->resultset('Group')->search( { }, { prefetch => 'users', '+as' => 'password_length', '+select' => { length => 'users.password' }, } ); とした場合、group->users->first->get_column('password_length') は例外になってしまいます。 正解は $schema->resultset('Group')->search( { }, { prefetch => 'users', '+as' => 'users.password_length',
prefetch(multi)した際は、order_byに気をつけること。 $schema->resultset('Area')->search( { }, { prefetch => 'prefectures', } ); この場合DBICはイテレータ、AreaとArea->Prefecturesに付随するデータをSQL一文で取得するわけです。 prefecturesはareaにとってhas_many(multi)です。 SQLはこんなかんじ。 SELECT me.id, me.name, prefectures.id, prefectures.hira_name, prefectures.name, prefectures.ascii_name, prefectures.abbr_name, prefectures.area_id, prefectures.position FROM
DBIx::Class::ResultSetManager - scheduled for deletion in 09000 - search.cpan.org DBIx::Class::ResultSetManager never left experimental status and has now been DEPRECATED. This module will be deleted in 09000 so please migrate any and all code using it to explicit resultset classes using either __PACKAGE__->resultset_class(...) calls or by switching from using DBIx::Class::Schema->load_classes()
ハマったメモ。 さてまた今回も若干適当な記事だけども、メモということでお許し願いたい。 ってか誰も言及してないっぽいんだけどもしかしてこの現象うちだけ? とにかくタイトルの通りで、検証時の各モジュールのVERSIONは以下の通り。 DBD::mysql-v4.005 DBIx::Class-v0.08100 前回のDBD::mysqlでSegmentation faultの件は無事解決したものの、今度はDB再接続時に文字化け発動でゲンナリしてました。 でログとか見てるとどうもDBICのon_connect_doで指定しているSET NAMES UTF8がDB再接続時に動いてないことが判明。 myapp_server.plだとちゃんとSET NAMES呼ばれるんだけどmod_perlだと何故か呼ばれない。 ってことでmod_perlに関係有りそうな部分をひたすら調べていたところ、mysql_
Sub::AutoでAUTOLOADを隠蔽 - dann@webdev - dann's portal が面白そうだったのでDBIC::ResultSetにfindBy〜を生やしてみた。 perldoc見ても$selfがどこに入ってくるのか分からんかったけど、@_に関数名のマッチが入って、その次に来るみたい。 #!/usr/bin/perl use strict; use warnings; package DBIx::Class::ResultSet; use Sub::Auto; autosub /^findBy(\w+)$/ { my ( $method, $self, $value ) = @_; $method = lc $method; return undef unless grep /^$method$/, $self->result_source->columns; $s
■ [catalyst][dbic][perl] CA::Creditional::* で auto_create ちょっと人に頼まれて、livedoor の認証 API を Catalyst で使うために Catalyst::Authentication::Credential::Livedoor を Catalyst::Plugin::Authentication::Credential::Livedoor からパクリつつ実装してたんだけど、認証 API だと元々手元の DB にはそのユーザはいないので、CA::Store::DBIx::Class とかを store に指定すると認証が通らなくなる。 そこで、auto_create を指定するらしいんだけど、ただ指定しただけだと auto_create なんてメソッド無いっていわれるので、テーブルクラスにメソッド生やしておく pack
DBICが発行するSQLのテーブル名をクォートさせたい を書いたら、hide-Kさんがトラバくれて解決策を提示してくれた。しかも、id:miyagawaさんからもブクマコメントで同様のアドバイスが。 Re:DBICが発行するSQLのテーブル名をクォートさせたい - はてな#hide-k 今回はCatalystでアプリを書いていたので、conf/myapp.yamlのconnect_infoを Model::DB: connect_info: - dbi:mysql:dbname - username - password - AutoCommit: 1 RaiseError: 1 PrintError: 0 quote_char: ` name_sep: . てな具合にしてやったら解決した。スバラシス 最初、quote_charだけを設定して動かしたら、 SELECT `me.id`,
DBICが発行するSQLのテーブル名をクォートさせたい - Lism.in * blog - nekoya (id:studio-m) 一応Cookbookに書いてあるけどちょっと注意。 My::Schemaに __PACKAGE__->storage->sql_maker->quote_char('`'); と書いてもSchemaクラスのstorageが準備されるのはconnectの後なので Can't call method "sql_maker" on an undefined valueでこける。 ドキュメントが間違ってるってことですね。 なので my $schema = My::Schema->connect($dsn, $user, $pass, {quote_char => '`',}); か my $schema = My::Schema->connect(...); $s
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く