PropelはPostgreSQLのSERIALをサポートしていない
Symfonyがデータベース周りの処理に利用しているPropelおよびCreoleは、SERIALやBIGSERIALといったPostgreSQLの連番型をサポートしていません。
- #4 (Change pgsql to use SERIAL) - Propel - Trac
- #109 (PostgreSQL Sequences and Propel Generator) - Propel - Trac
これはつまり、YAMLもしくはXMLで記述したデータベーススキーマ定義に「userテーブルのidカラムをDBネイティブな採番方式にしろ」と指示があっても、symfony propel-build-sqlを実行した場合に生成されるSQLが以下のようになってしまうということです。
DROP TABLE "user" CASCADE; DROP SEQUENCE "user_id_seq"; CREATE SEQUENCE "user_id_seq"; CREATE TABLE "user" ( "id" INTEGER NOT NULL, /* SERIALになっていない */ "name" VARCHAR NOT NULL, PRIMARY KEY ("id") );
このままでも、Propelが生成したモデルクラスがINSERT時に呼び出している symfony/vendor/creole/drivers/pgsql/PgSQLIdGenerator.php の中で以下のような実装がされているので実害は無いのですが、モデルクラスを利用せずにINSERTを行う場合は同様のことを手動で行う必要があるため注意が必要です。
/** * @see IdGenerator::getId() */ public function getId($name = null) { if ($name === null) { throw new SQLException("You must specify the sequence name when calling getId() method."); } $rs = $this->conn->executeQuery("SELECT nextval('" . pg_escape_string ( $name ) . "')", ResultSet::FETCHMODE_NUM); $rs->next(); return $rs->getInt(1); }
