ホーム > タグ > PostgreSQL
PostgreSQL
CakePHP 1.2.10 を PostgreSQL で使っているときに Fixture で SERIAL 型に INSERT すると SEQUENCE がインクリメントされない
- 2011/06/28 14:03
- 軟
なんでバグチケットみたいなタイトルなんだろう。まいいや。
CakePHP でアプリを作ると,モデルへ新規レコードを保存 (AppModel::save()) するときには id (SERIAL 型とか AUTO_INCREMENT 属性とか)のデータを与えず,DB の自動生成に任せることが多いと思う。
ところが UnitTest の fixture を書くときには,id も固定値でないと想定外の結果になったりして assertion が書けなくなってしまうので,id も与えて INSERT するようにテストデータを定義したい。
ここで問題が発生する。
PostgreSQL の場合,自動で挿入した id を記録しておくために SERIAL 型のレコード毎に SEQUENCE を持って保存しているんだが,SEQUENCE は SERIAL 型の DEFAULT 値に設定されている nextval() が生成した id を使っているため, fixture のようにアプリケーションが id を指定して INSERT してしまうと SEQUENCE を更新する奴が誰もいなくなってしまう,というおはなし。
Cake on MySQL でどうなってるのかは知らん。
というわけで,これに対処するために CakeTestFixture を継承した AppTestFixture でも作って app/tests にでも置いておく。
< ?php
class AppTestFixture extends CakeTestFixture
{
function insert(&$db)
{
$result = parent::insert($db);
if (array_key_exists('id', $this->fields)
&& $this->fields['id']['type'] == 'integer'
&& $this->fields['id']['key'] == 'primary'
) {
$db->fetchAll("SELECT pg_catalog.setval(pg_get_serial_sequence('{$this->table}', 'id')"
. ", (SELECT MAX(id) FROM {$this->table}), true);", false);
}
return $result;
}
}
あとはこれを継承して fixture を書けばおけ。
< ?php
require_once TESTS . 'app_test_fixture.php';
class HogeFixture extends AppTestFixture
{
var $name = 'Hoge';
var $import = array('table' => 'hoges', 'connection' => 'default');
var $fields = array(
0 => array(
'id' => 1,
'foo' => 'bar',
),
1 => '以下略',
);
}
ホーム > タグ > PostgreSQL
- BS 機器のアンテナ接続に F 型接栓つかわない男のひとって……/今読: BSデジタル追加チャンネルの放送によるモバイルデータ通信(ULTRA SPEED等)への影響について | ソフトバンクモバイル株式会社 - http://t.co/hG8R90Ec
- 火事多いな。先週頭に降ってからまた乾燥してきたか。
- 古いコードは,あんまりよくないサンプルに影響されてへんな書き方してるところあるんだよな。近場を修正するときに一緒に直しておこう。 $(function() { $(document).ready(function() { }); });
- RT @syuu1228: ΩΩΩ< RT @nakj: VimSHell、つまりVim's Hell ってことだったんだよ。人類は滅亡する
- しごとならんので再起動してアクセス権チェックとかやってみるか
- メモリに余裕作ったんだがなんかもっさりしてるよ Lion さん。
- まさか GPU がいかれたとかないよね,ね。 http://t.co/WgOKR4AK
- 2003 年くらいから,ケータイのメアドをひとに教える時は転送サービスのアドレスを出したはず。転送先を GMail に変えとこう。
- docomo のケータイ,どうせ業者系のしか来ないしと思ってメールチェックを 2 週間ほどサボってたら友人から来てた。すみませんすみません。
- 歯医麻酔用に電動注射器というのがあって,調べてみると注射してるあいだメロディを流せるやつがあったりして面白い。X ファイルのテーマとか入ってないかな。
- 帰ろ
- Python で遊んでたらこんな時間に
- そこらへん OS X の Cocoa フレームワークはよくわかっとるっつーかデフォルトで ^h は deleteBackward.
- Emacs 風キーバインドなのに C-h を Backspace に設定できないエディタはみんなばくはつしろ!
- Web アプリ側でフレームワークに乗ってるとどうもやってることが単純になりがちだけど,Python でクライアント側のスクリプトをオブジェクト指向で書いてると 「あーこれは Visitor パターンに載せよう」 とかなったりして思い出すあのころの楽しさ。そう,設計って楽しい。
- ふと修正に飽きたので今朝おもいついたやつを Python でいじりはじめた。
- vim で set relativenumber するとマクロによってはけっこう遅くなるな。気をつけよう。
- /bin/dash とかまじトラップ。bash じゃねーのかよ!
- あー他のユーザー権限のこと忘れてた。Skipfish 叩く Python スクリプトでも書くか。もうシェルスクリプト書くのつらい。
- 「刺さる」 って聞くようになったの結構最近だよな。2009 年くらいか?