タグ

DBIに関するxaicronのブックマーク (16)

  • DBIx::TransactionManager の目的と、その使用法について - tokuhirom's blog

    おはようございます。 DBI では当たり前のように $dbh->do('BEGIN') と $dbh->do('COMMIT') をつかえばトランザクションがつかえるわけですが、なぜ DBIx::TransactionManager のようなものが必要になったのでしょうか。 それは勿論、DBI で直接 transaction をとりあつかうと問題が発生するケースが存在するからです。 トランザクションと RAII一番おおきいのは、トランザクションが中途半端な状態になってしまうことを阻止することです。たとえば、以下のようなケースでは、おかしなことになってしまいます。 my $dbh = DBI->connect(...); for (@stuff) { eval { $dbh->do("BEGIN"); $dbh->do(q{INSERT INTO t1 (v) VALUES (?)}, $_

  • データベースへのクエリをトレースする PSGI ミドルウェア - tokuhirom's blog

    これをつくってる途中で、DBIx::QueryLog がめんどくなってきて DBIx::Tracer をつくってしまったのでした。 なんか無駄に threashold_sum_total_cnt とかで設定できるようになってるけど、手でいじって適当に自分のプロジェクトにぶっこんだ方が便利な気がします。 とくに CPAN にあげたりする予定はありません。 package Plack::Middleware::DBProfile; use strict; use warnings; use utf8; use 5.10.0; use parent qw(Plack::Middleware); use Plack::Util::Accessor qw(path_re threashold_sum_total_cnt threashold_total_time threashold_total_c

  • DBI#cloneというメソッド - blog.nekokak.org

    http://search.cpan.org/dist/DBI/DBI.pm#clone DBIにcloneメソッドがあることを@nihenさんがみつけました。 #いやーDBIのドキュメントは良く読むと便利メソッドが一杯ありますね TengとかSkinnyではconnect_infoを受け取るだけでなく、 $dbhを受け取って利用する仕組みも提供しているのですが、 そこで一番問題になっていたのはdbへの接続がブチギレた場合のreconnectの問題でした。 connect_infoがある場合は接続情報を自分で持っており、簡単に再接続できるんですが $dbhしかない場合はいままでできないとおもっていました。 DBI的にも接続時につかったpasswordを取るインタフェースがなかった。 なので$dbhを渡された場合は自動reconnectは行わずにエラーで死亡にするようになってたんですが、 D

    xaicron
    xaicron 2011/11/15
  • DBIx::Handler的なものをでっちあげた件 - blog.nekokak.org

    最近はORMを一切使わず生なDBIでもりもりコードかいてます。 ORMを使うと隣の人に刺されるのでェ で、です。生のDBIを使うとforkする処理を書く時に面倒だったりします。 現在のところDBIx::Connectorとかつかってて基問題ないんですが、 どうしてもこのDBIx::Connectorのインタフェースが気に入らなくてイライラしてました。 隣の人はそうでもないみたいですが で、です。ついカッとなってDBIx::Handlerというのを書きました。 実はこいつは今年の初め頃に一度軽く書いたんですが、その時はDBIx::Connectorよりも低機能だし おれおれコネクター書くのはよくないよなーとおもって自重してたんです。 でもついカッとなったのでしかたないです。 個人的なDBIx::Connectorの嫌な部分を列挙すると、 - トランザクションのかけ方がcodeblockでし

    xaicron
    xaicron 2011/06/30
    ふーむ。すごい勢いで dis られてるなーw
  • 生 DBI ユーザーのための DBI Cookbook (6) - 日向夏特殊応援部隊

    さて、今日は selectcol_arrayref です。昨日、会社のグルメな同僚に教えて貰いました。 ちょうど 生 DBI ユーザーのための DBI Cookbook (1) - Yet Another Hackadelic にて selectall_arrayref + Slice, selectall_hashref などの使い方を書きましたが、こちらもかなり便利。 CREATE TABLE `application` ( `id` int(10) unsigned NOT NULL, `title` varchar(32) CHARACTER SET sjis NOT NULL, `created_on` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_on` timestamp NOT NULL DEFAULT

    生 DBI ユーザーのための DBI Cookbook (6) - 日向夏特殊応援部隊
    xaicron
    xaicron 2011/01/06
    自分もこれを知らずにだいぶ遠回りなコードを量産してました!!
  • How do you trace your query with DBI - tokuhirom's blog

    DBIx::QueryLog とかつかわなくても Callbacks を駆使すれば結構いけるよ!っていう話になった。いいね。 use strict; use warnings; use DBI; my $dbh = DBI->connect('dbi:SQLite:','','', { RaiseError => 1, Callbacks => { ChildCallbacks => { execute => sub { my ($obj, @binds) = @_; my $stmt = $obj->{Database}->{Statement}; $stmt =~ s/\?/'$_'/ for @binds; print STDERR $stmt, "\n"; return; }, }, }, }); $dbh->do(q{create table job (func, time)})

  • にひりずむ::しんぷる - DBI で実際に発行されるクエリーを取得する DBIx::QueryLog を書いた

    季節が変わって、早速風邪をひいています。 さて、もう秋を通り越して冬の様相を呈してきた昨今ではありますが、DBI では、普通はプレースホルダを使い my $stmt = 'SELECT * FROM user WHERE user_id = ?'; my @bind = ($user_id); $dbh->do($stmt, undef, @bind); とか書くと思います。 このときに、実際にバインドされた後の SQL をみたいなーって衝動に駆られると思いますが*1、どう頑張ってドキュメントを読んでもわかりませんね。 こういうときは仕方ないので、$stmt と @bind を両方ログに出してお茶を濁していました。 $self->log->_dump($stmt, @bind); # => SELECT * FROM user WHERE user_id = ?, [1234] でもこれっ

  • Devel::KYTProfがだいぶいい!

    仕事でアプリのボトルネックを探しているという話をしたら、hideokiさんが 「YAPC::Asia 2010 で cho45 が紹介してた Devel::KYTProf がいいよー」 って言ってたので、使ってみたらだいぶよかったのでご紹介。 Devel::KYTProfの作者はid:onishiさんで、リポジトリはhttp://github.com/onishi/perl5-devel-kytprofにあります。 このモジュール、何ができるモジュールかっていうと(まぁcho45さんの発表動画見ればわかるのですが)、モジュール名とメソッド名を指定してやると、そのメソッドの処理にかかった時間をさくっと調べられるというものです。 たとえば Foo::Controller::Bar の baz() って関数の処理時間が知りたかったら、そのアプリケーションのメインモジュールに use Devel:

  • 第36回 SQL::Abstract:簡単なSQLはより簡単に | gihyo.jp

    DBIの泣き所 いわゆるLAMPないしそれに似た環境でウェブサービスばかり書いている方にはあまり実感がないかもしれませんが、あちらの現場ではOracleを、こちらの現場ではMicrosoft SQL Serverを、はたまた別の現場では組み込みのSQLiteを、といった受託系の仕事をしている人にとって、SQLの方言問題は避けては通れないもののひとつです。 典型的なところでは、たとえばSELECTで取得するデータの件数を制限したい場合、PostgreSQLなどでは「LIMIT ... OFFSET ...」のように書きますが、OracleではROWNUMを使いますし、MS SQL serverならSET ROWCOUNTやTOPを使います。また、いまでこそPostgreSQLとの互換性を確保するため「LIMIT ... OFFSET ...」と書けるようになっているMySQLにしたところで、

    第36回 SQL::Abstract:簡単なSQLはより簡単に | gihyo.jp
  • 生 DBI ユーザーのための DBI Cookbook (5) - 日向夏特殊応援部隊

    まさかの続編ですよwww HandleError を使ってより詳しいエラーを得る 今日、帰りに @myfinder さんと話していて、syslog-ng に吐かれるエラーで Too many connection とかをちゃんと監視しつつも、エラーメールボムによって大事な思い出が消えたりしないようにしたいねー的なことを話していて、その場合はエラーナンバーをきちんと記録するだの、エラーが起こった DB の host 名だとかで良しなにエラー通知間隔を制御したいよねと。 そういう際にやっぱり DBホスト名だとか追加情報がエラー文字列に入ってると便利だろうなということでこんなソリューションはどうかと。 #!/usr/bin/perl use strict; use warnings; use Test::More; use Test::Exception; use Carp; use Dat

    生 DBI ユーザーのための DBI Cookbook (5) - 日向夏特殊応援部隊
  • 第35回 DBI:生のSQLが散らばると言う前に | gihyo.jp

    Perldbm いまでは省みられることも少なくなりましたが、Perlには1989年にリリースされたバージョン3.0以降、dbmと呼ばれるシンプルなデータベースにアクセスする機構が標準で組み込まれています。このdbmは、いわゆるリレーショナルデータベースとは違ってキーと値の組み合わせをディスクに保存できるだけのものですが、ハッシュ(当時はまだ連想配列と呼んでいました)と結びつけることでタブ区切りファイルなどを読んでいくより高速に検索ができたため、ユーザ環境に永続的なデータを保存する手段のひとつとして重宝されていました。Perl 3/4の時代にはdbmopenというコマンドが使われていましたが、この機構はPerl 5になって一新され、いまではより汎用的なtieというコマンドを使うことになっています。この仲間としては古くからあるBerkeley DBやGDBMなどのほか、最近では平林幹雄氏のT

    第35回 DBI:生のSQLが散らばると言う前に | gihyo.jp
  • DBD::SQLite 1.30_02 - Charsbar::Note

    あと、先日リリースしたDBD::SQLite 1.30_02の変更点について。 DBD::SQLiteはこれまで DBIが用意した枠組みの範囲内でのトランザクションを利用している(AutoCommit/begin_work) fork()などを利用して並列性を高めている 読み書きを平行して行っている といった条件が重なったときにトランザクションがデッドロックすることがある、という問題を抱えていました。最小限の再現コードはこんな感じになります。 use strict; use warnings; use DBI; my $pid = fork(); if ($pid) { do_transaction(); } else { sleep 1; do_transaction(); exit; } unlink 'test.db'; sub do_transaction { my $dbh =

    DBD::SQLite 1.30_02 - Charsbar::Note
  • SQL::Abstract::Plugin::InsertMulti - 日向夏特殊応援部隊

    作ってみました。元ネタは MySQLにおけるbulk insert と bulk update - 金利0無利息キャッシング – キャッシングできます - subtech です。bulk insert, bulk update *1 が出来ます。 SQL-Abstract-Plugin-InsertMulti-0.05 - add mysql bulk insert supports for SQL::Abstract - metacpan.org GitHub - zigorou/p5-sql-abstract-plugin-insertmulti: bulk insert and update support for SQL::Abstract 使い方は非常に簡単で、t/01_basic.t とか見て頂けるとすぐ分かるかと思いますがこんな感じです。 use strict; use wa

    SQL::Abstract::Plugin::InsertMulti - 日向夏特殊応援部隊
  • DBIx::ProfileManager で SQL Profiling | BLOG - DeNA Engineering

    風邪を引きっぱなしで全然治らない山口です。恐らくネット上では zigorou と言うハンドルでご存知の方もいらっしゃるかもしれません。 まずは技術系のネタの第1弾です。 今回は実際にモバゲーオープンプラットフォームで用いている SQL Profiling の方法をご紹介致します。 DBI::Profile について モバゲータウン ではデータベースは MySQL を用いており、サーバーサイドプログラムから管理ツールまでのほとんどが Perl で書かれており、 当然ながら DBI モジュールまたはそれを利用したモジュールを使って DB アクセスをしています。 今回、オープンプラットフォームチームで作った OpenSocial RESTful API ですが、モバゲータウン内のデータベースに大量にアクセスする為に日々どのようなクエリが実行され、どれくらいの実行時間が掛かっているかは常に気になる

    DBIx::ProfileManager で SQL Profiling | BLOG - DeNA Engineering
  • oinume journal

    Raycastを使い始めて1年経ったので、どういうことに使っているかを振り返ってみる。去年書いた AlfredからRaycastに移行した - oinume journal の記事から少し使い方が変わっているところもあるのでメモがてら。 基的な使い方 Cmd + QをRaycast起動のショートカットとして割り当てている。Pro版は使っていないのでAI機能などは使ったことがない。 ブラウザのブックマーク検索など、よく使うけどHotKeyを割り当てるほどでもないRaycastコマンドはbmのようにAliasを設定している。 Cmd + QでRaycastを起動してbmと入力するとブックマークの検索ができるので楽ちん アプリケーションランチャー機能 アプリケーションを起動するときのランチャーとして使っている。よく使うアプリにはHot Key(ショートカット)を割り当ててる。 Clipboar

    oinume journal
  • DBIx::RewriteDSN で - JPerl Advent Calendar 2009

    前置き みなさんこんにちは、cho45 です。 こちらは hacker track ということで、僕がつくったモジュールの一つを紹介したいとおもいます。今回ご紹介するモジュールは DBIx::RewriteDSN です。 DBIx::RewriteDSN は非常に小粒なツールですが、なかなか苦しいモジュールなんじゃないかと自分でもおもっています。使わなくていいなら幸せでしょうね。 歴史あるプロジェクトを開発する際、データソースがハードコードされているというようなケースはままあります。さっさと書きかえられる程度ならばいいのですが、修正箇所が多ければ多いほどミスが発生しやすいわけですし、それが番のデータベースであるならば、一箇所ミスをしただけで甚大な被害が出ることも予想するに難しくありません。 「DBI は使っているが、データベースサーバへの IP などが各所にちらばっており、こわくて

  • 1