タグ

dbicとperlに関するbsheepのブックマーク (23)

  • DBIx::Class で sql_maker が生成した SQL をロギングする方法

    DBIC いろいろ使って検証を続けているのですが、O/R Mapper って当たり前だけど万能じゃぁないなぁ〜とすごく思う今日この頃。正直、リレーションとか張りまくってる場合、自前で JOIN とか View 定義して書いた方が遙かに効率の良い SQL が記述できる。 複雑な SQL を表現するには、O/R Mapper だと逆に見づらいなぁ〜と思ったり。 とはいえ、単純な SQL の場合はやはり便利。コードも見た目、OO っぽくてかっこいいし。 でも、どうにも解析できなかったことが一つ。DBIC しか見てないんですが、sql_maker が生成した SQL をロギングする方法がわかりません。なんかコードを深追いしていくと、 メンドウなので、モジュールにしてなくってとってつけたような感じで実現。たとえば、Catalyst だと MyApp.pm で use UNIVERSAL::requi

  • DBIC でSELECT時に複雑な関数を使いたい(例、年齢計算) | ブログが続かないわけ

    ユーザーのプロフィールとして年齢を持ちたい場合、実際に年齢をユーザーに入れさせてしまうと、データの更新が必要になり大変です。当然、ユーザーには生年月日などを登録してもらうことになるわけですけど、そうなると、年齢を表示するときに、ちょっとした年齢計算が必要になります。うるう年のことなども考えると結構面倒なので、このあたりはSQLの関数でバシッと計算する方がラクにできます。 データベースには生年月日が登録されている場合に、年齢を取得することを考えてみましょう。SQLはちょこっと複雑になりますが、MySQLのサイトに解答が出ていますのでそのまままねてしまうことにします。 【参考】MySQL 4.1 リファレンスマニュアル :: 3.3.4.5 日付計算 birth というカラムに生年月日が入っているとすると、SQLはこんな感じになります。SELECT user_name, birth, (YEA

    DBIC でSELECT時に複雑な関数を使いたい(例、年齢計算) | ブログが続かないわけ
    bsheep
    bsheep 2009/04/07
    DBICで年齢計算
  • DBIx::Classのページング処理 - 高知ではたらくひとのブログ

    現在、DBIx::ClassとTemplate Toolkitを勉強しているところですが、ページングの処理が驚くほど簡単に書けるので自分用のメモを残しておきます。 CGI側でresultsetオブジェクトに対しpager()をコールすることで、Data::Pageオブジェクトを取得できます。 my $q = CGI->new; my $schema = App::Schema->connect; my $iterator = $schema->resultset('Comment')->search({}, {rows => 5}); # 1ページ辺りの行数は5 my $page = $q->param('page') || 1; my $rs = $it->page($page); # 1ページ目のresultsetオブジェクトを取得 print $q->header('text/htm

    DBIx::Classのページング処理 - 高知ではたらくひとのブログ
  • DBIC::Schema::Loaderのカスタマイズと言うネタでプレゼンするはずだった件 - 日向夏特殊応援部隊

    話してないけど、資料はあるので公開しまっする。 Customization of DBIC::Schema::Loader 概要 開発中にスキーマに変更が発生して、make_schema_at()を何度も叩く際に困ることと、Schema::Loaderで比較的意図した通りにSchema, Tableクラスを生成する為に、こんな風にするといいおって内容です。 せっかちな人向け こんな感じ。 内容の解説はプレゼン資料を見てくだしあ。 #!/usr/bin/perl use strict; use warnings; use FindBin; use File::Spec; use lib ( File::Spec->catfile( $FindBin::Bin, qw/.. lib/ ), File::Spec->catfile( $FindBin::Bin, qw/.. schema/ )

    DBIC::Schema::Loaderのカスタマイズと言うネタでプレゼンするはずだった件 - 日向夏特殊応援部隊
  • Catalyst/DBICでDigest認証する - 日向夏特殊応援部隊

    自分の為のメモですよ。 準備 まずはCatalystプロジェクトを作ります $ mkdir -p /path/to/dir $ cd /path/to/dir $ catalyst.pl AuthSample ユーザー用のDBICスキーマを定義します。 $ module-starter --module AuthSample::Schema $ cd AuthSample-Schemaでこのディレクトリにて、 CREATE TABLE user ( user_seq INTEGER PRIMARY KEY, user_id TEXT UNIQUE, password TEXT, created_on DATETIME, updated_on DATETIME ); こんなスキーマを定義して、schema.sqlとして保存して、 $ sqlite3 -init schema.sql auth

    Catalyst/DBICでDigest認証する - 日向夏特殊応援部隊
  • ゆーすけべー日記

    サキとは彼女の自宅近く、湘南台駅前のスーパーマーケットで待ち合わせをした。彼女は自転車で後から追いつくと言い、僕は大きなコインパーキングへ車を停めた。煙草を一吸ってからスーパーマーケットへ向かうと、ひっきりなしに主婦的な女性かおばあちゃんが入り口を出たり入ったりしていた。時刻は午後5時になる。時計から目を上げると、待たせちゃったわねと大して悪びれてない様子でサキが手ぶらでやってきた。 お礼に料理を作るとはいえ、サキの家には材が十分足りていないらしく、こうしてスーパーマーケットに寄ることになった。サキは野菜コーナーから精肉コーナーまで、まるで優秀なカーナビに導かれるように無駄なく点検していった。欲しい材があると、2秒間程度それらを凝視し、一度手に取ったじゃがいもやら豚肉やらを迷うことなく僕が持っているカゴに放り込んだ。最後にアルコール飲料が冷やされている棚の前へ行くと、私が飲むからとチ

    ゆーすけべー日記
  • DBIC::Schema::Loaderを久々に使ってみる - Hatena::Diary::Neko::kak 500 Internal Server Error

    普段からLoader使っている人には目新しい話題はない予定。 思い出すことから始めてるので。 load_from_connectionがdeprecatedになってた。 バージョン0.04000では削除されるらしいので使わないようにすべし。 ってことで、 package TestDBIC::SchemaL; use strict; use warnings; use base 'DBIx::Class::Schema::Loader'; __PACKAGE__->load_from_connection( dsn => 'dbi:mysql:test_dbic', user => 'test', password => 'testtest', relationships => 0, debug => 1, ); 1; こうではなく、 package TestDBIC::SchemaL; u

    DBIC::Schema::Loaderを久々に使ってみる - Hatena::Diary::Neko::kak 500 Internal Server Error
  • 今日のCPANモジュール(跡地) 目次

    Redirecting… Click here if you are not redirected.

  • ResultSetじゃなくて、配列やハッシュで取得するコンボネント - Lazy Programmer :-p

    追記 名前変更してcodereposに上げてみました。 http://svn.coderepos.org/share/lang/perl/DBIx-Class-AsArrayHash/ 独自にキャッシュしたいときや、viewがオブジェクトをサポートしてない時とかに必要にかられる。 コンポネント DBIx::Class::ResultSetX package DBIx::Class::ResultSetX; use strict; use warnings; use base qw( DBIx::Class ); __PACKAGE__->load_components(qw/ResultSetManager/); sub searchX : ResultSet { my $self = shift; my $cond = shift || {}; my $args = shift || {

    ResultSetじゃなくて、配列やハッシュで取得するコンボネント - Lazy Programmer :-p
  • ランダムな文字列を生成するString::Random - Unknown::Programming

    普段から良く使うんでメモ。 DBとかにユニークな値を突っ込む時とかにランダム文字列生成とかよくあること。 で、Perlでランダム文字列を生成しようと思ったらString::Randomがオススメ。 色々作り方があるんだけど一番便利なのはrandregexメソッド。 use String::Random; my $rand_str = String::Random->new->randregex('[A-Za-z0-9]{32}'); こんな感じで正規表現が指定できるので上記のように書くと32桁の英数字でランダムな文字列を生成してくれる。 ちなみにDBに突っ込む目的ならDBIx::Class::RandomStringColumnsってのがString::Randam使用して勝手に突っ込んでくれたりするので便利だったりする。

    ランダムな文字列を生成するString::Random - Unknown::Programming
  • DBICでハマらないために Vol.1 (bokut.in)

    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

  • DBIC で件数順に並び変える(count したものにorder by) | ブログが続かないわけ

    count を取ってそれを表示するのは次のコードで問題ないです。まあ、想像どおりですね。my @ranking_posts = $c->model('DBIC::TranMatchTrackBack')->search( $query_ref, { select => [ 'user_id', { count => 'user_id' } ], as => [qw/ user_id posts_count /], group_by => ['user_id'], }, ); foreach(@ranking_posts){ $_->{posts_count} = $_->get_column('posts_count'); } これをposts_countで並び変えたいという要望はよくある話です。というか、並び変えないと意味ないことの方が多い。 ところが、これがなかなか難しい。想像すると、

    DBIC で件数順に並び変える(count したものにorder by) | ブログが続かないわけ
  • DBICでRAND()つかうぜ - Hatena::Diary::Neko::kak 500 Internal Server Error

    http://d.hatena.ne.jp/jojo_a_gogogo/20061220/1166612945 これ、普通に、(普通かどうかしりませんが) $self->model('Member')->search( { }, { order_by => \'RAND()', page => 1, rows => 3, } )->first; 実行されるSQL SELECT me.id, me.name FROM member me ORDER BY RAND() LIMIT 3 こんな感じ。これじゃだめぽ?

    DBICでRAND()つかうぜ - Hatena::Diary::Neko::kak 500 Internal Server Error
  • 2007/05/07 - memo - unknownplace.org

    書き忘れたけどさっきの update_schema.pl は ./script/myapp_update_schema.pl dbi:mysql:tablename username password 見たいな感じで DSN を渡す必要がある。めんどう。 ここら辺があれでまだヘルパーにはなってない。 mizzy.org : Re: DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い 僕の中で流行ってる使い方があるのでかぶせて書いておいてみる。mizzy さんの二個目の例を自分ルール化させた感じ? 作業は一般的なCatalystアプリのディレクトリ構造上であるとして、そこに新しく schema というディレクトリを作成。 そんで、 schema/lib/Schema/{TableName}.pm に各テーブルのリレーション定義とかメソッドとかを自分で書く。

  • mizzy.org : Re: DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い

    ブログが続かないわけ | DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い にて、 とはいえ、僕の稼働中のアプリはすでに手動型のSchema で動いている。スキーマを作り直したら、リレーションの設定を全てしなおさなければならないので、それは現実的じゃない。inflate, deflate の指定は、やっぱりすべてのSchema にかかなきゃだめそうだ。 とあったので、これに関して少し楽ができる方法をコメントしようと思ったけれど、コメント欄ではうまく伝えられる自信がないので、こちらで書いてみることにしました。 load_components で 読み込む方法 DBIx::Class::Schema::Loader ではなく DBIx::Class::Schema を継承したスキーマの場合には、各スキーマファイルに以下の様に書いてあげれば OK です。(既

  • DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い | ブログが続かないわけ

    先日から、DBICに関するエントリをいくつかしているが、そこに大変参考になるトラックバックやコメントを頂いている。何となく理解しているつもりだった、Schema::Loader の仕組みなど、いくつか勘違いしているっぽいことがあったので、ここにまとめておく。 今日のCPANモジュール|use DBIx::Class; 事前に「データベース」に対応したクラス(スキーマクラス)や、「テーブル」に対応したクラスを用意しておき、プログラムではそいつらを通して DB にアクセスします。 そうだね。ここまではいい。スキーマクラスはしっかりと用意している。ただ、このスキーマクラスに対する理解がちょっと違ったみたいだ。 この対応クラスを用意するには手動と自動の2種類あります 自動の場合は、DBIx::Class::Schema::Loader を継承し 手動の場合は、DBIx::Class::Schema

    DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い | ブログが続かないわけ
  • DBICで本当に困ったら SCALAR REFERNCE を使え - daily dayflower

    追記 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

    DBICで本当に困ったら SCALAR REFERNCE を使え - daily dayflower
  • YappoLogs: DBIx::Class::Schemaの使い方

    DBIx::Class::Schemaの使い方 亀レスだけどSchema::Loaderネタが流行ってたみたいなので、最近の自分の使い方を。 まぁSoozyつかってるのでmake_schema_atで作られた静的なSchema使ってるんだけども。 自分的にはSchmeaクラスは一切手をつけたく無いので、大部変わった事をしているかも。 若干mfacインスパイアぎみではあるけど。 package Soozy::Plugin::DBIC::AutoSetup; (略) sub setup_components {#Catalyst::setup_componentsとほぼ同じ my $class = shift; my $schema_bases = Soozy::Component::Loader->find_components( '', search => [ $class->base_c

  • Schema::Loader with CatalystComments

    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 なんかが定義されていてそれを使う場

  • SQL::Abstract かしこす - daily dayflower

    以前「DBICで当に困ったら SCALAR REFERNCE を使え - daily dayflower」にて, DBIC で WHERE field1 IS NOT NULL な検索をしようと思って, …… $resultset->search({ field1 => \'IS NOT NULL' }); とか書いていたんですが, $resultset->search({ field1 => { '!=', undef } });でよかったのでした。 $resultset->search({ field1 => undef });が WHERE field1 IS NULLというのは知っていたんですが,'!=' をつけるときちんと「IS NOT NULL」に変換してくれるとは(SQL::Abstract の 714 行目あたりのロジックとしてちゃんとありました)。これでスカラーリファレ

    SQL::Abstract かしこす - daily dayflower