centos5 postgresql symfony で Unable to get sequence id になっちゃうとき

すっごく間があきましたが淡々と書いていきます。

centos5 をインストールして、yumでpostgresql 8.1.11 を入れて、symfony 1.0.14をtarballで入れました。

その後、postgresqlにserial型のidというフィールドをもつテーブルを作って、

./symfony propel-build-schema
./symfony propel-build-model
./symfony propel-init-admin admin <module_name> <model_name>

管理画面に自動生成を行いました。

表示されています。

うんうん。いいですね!新規追加もしてみよう。あれ?エラーがでたぞ?

Unable to get sequence id. [wrapped: Could not execute query
Native Error: ERROR: relation "<table_name>_seq" does not exist]
[User Info: SELECT nextval('<table_name>_SEQ')]]

そんなとき。

現象としては、エラーメッセージのとおりで、<table_name>_SEQという名前のシーケンスがないよ、ということです。データベースを見てみると、確かにないです。<table_name>_<serial_column_name>_SEQ という名前になっています。

grepしてコードを読みまくると、

./symfony propel-build-model

上のコマンドで自動生成されるpropelのORマッパーに、その名前が書き込まれています。

lib/model/map/<model_name>MapBuilder.php
中の
tMap->setPrimaryKeyMethodInfo('<table_name>_SEQ');
いうところです。

では、この部分はどこで自動生成されているか。

lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php
getSequenceName関数です。

この関数を見る限り、これは仕方ない動作。

ではどう解決するか。

(1) getSequenceName をハックする。たとえば、

// change to postgresql style sequence name
// $result = $this->getName() . "_SEQ";
$pk = $this->getPrimaryKey();
$result = $this->getName() . "_" . $pk[0]->getName() . "_SEQ";

(2)propel をバージョン1.3.0betaに入れ替える。
wikiにも書いてありますし、ダウンロードしてソースを見たところ対応しています。
see getSequence

※保証された組み合わせではないです。自己責任でお試しください。

(3) sqlでシーケンス名を変える。

以上です。

ぼくが採用したのは (1) です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>