今回は Perl の O/Rマッパー Teng を触ってみます。特に触れない限りMySQLを利用しているということにして、コードのサンプルは DB名 teng_test / 利用するテーブルは users / そのテーブルレイアウトは mysql> SHOW FIELDS FROM users; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_
こちら Yappo の日でございますが、 Yappo の執筆ペースが芳しくないので、本日も社員のオオサワが代打で「DBI」や「ORM」について書かせて頂きたいと思います。 trigger / hook point insert, update, delete クエリの前後処理を拡張して、レコード作成時刻の設定や update 時刻の更新はたまたレコード削除時に削除テーブルへの自動コピー等を、一度ベースクラス上で定義しておけば新しく作るテーブルへも use parent する等して簡単に適用出来きるように便利になりますが、うっかりしてると後続の開発者がハマったり制約が出てきます。 DBMS の trigger ORM の機能の trigger を多用していると、後続は DBMS 本体の trigger を使う事に躊躇します。使っちゃいけないというわけではないでしょうが、一つのクエリに対する副
perlでデータベースを使う時に誰もが必ず使うDBI。その接続時に使うconnectメソッドの第4引数に設定しているオプションがサービスによりまちまちなんだけど、だれか鉄板設定を教えてください。 僕が使うのが、 my $dbh = DBI->connect($dsn, $user, $password, { AutoCommit => 1, PrintError => 0, RaiseError => 1, ShowErrorStatement => 1, AutoInactiveDestroy => 1, }); これ。 加えて、mysqlであれば mysql_enable_utf8 => 1 mysql_auto_reconnect => 0, SQLiteだと sqlite_unicode => 1 sqlite_use_immediate_transaction => 1 を追加し
実際ググれば正解はいっぱい出てくるしここに自分もコメントで書いてたりしていまさら書く必要もないかなと思ってたけど一応自分のブログでもまとめておくということで。 一般的な解 DBIx::ConnectorとかDBIx::Handler経由でかならず$dbhを取得してからDBIを使う。 もしくはfork-safeなORM(DBIx::Class, DBIx::Skinny, Teng)を使う。 DBIを直接使っている場合 一般的なコネクションを保持するクライアントと同様にDBIもforkした子供が親のコネクションをそのまま使うことはバグの原因になります。特にトランザクションの処理等で重大な問題が起こる可能性がある。 解決策は、 DBIのコネクションを親で作らないで、子供で独自に作る 親で作ってしまったコネクションを子供が安全にDESTROYし、再接続する のどちらかになります。ここで問題は2で
ちょっと前まで DBI で非同期アクセスなエントリが各所で上がっていましたが皆さん如何お過ごしでしょうか? さてと、、、歴史的な経緯とか歴史的な経緯とかで生 DBI 相当を使ってる方もそれなりにいるでしょう。奥さん、大事な事なんで二度言いましたよ! DBI のインターフェースってまぁそんな使いやすい物じゃないんですが、工夫次第で出来る事もあります。 ちなみにサンプルデータベースとして、MySQL Documentation - Example Databases の world データベースを使っています。 fetchall_arrayref でデータ整形 まず以下のように使ってみます。 #!/usr/bin/perl use strict; use warnings; use Data::Dump qw(dump); use DBI; use Perl6::Say; my $dbh =
« ウェブサービスのためのMutex - KeyedMutex | メイン | Perl で並列処理 (using マルチプロセス) » 2007年09月28日 DBI::Printf - A Yet Another Prepared Statement Java や C++ のような関数のオーバーロードができる言語では、プリペアードステートメントのプレースホルダが型をもつ必要はありません。しかし、Perl のように数値型と文字列型の区別がない言語で最善を期そうとすると、変数をバインドするタイミングで型を意識してコードを書かなければならず面倒です。 (参考: MySQL の高速化プチBK) だったら、printf のように、プリペアードステートメントのプレースホルダで型を指定できればいいのに、と、もともとは Twitter でつぶやいたネタなのですが、SQLステートメントをキーとしてキャッ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く