すっごく間があきましたが淡々と書いていきます。
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) です。