PropelはPostgreSQLのSERIALをサポートしていない

Symfonyがデータベース周りの処理に利用しているPropelおよびCreoleは、SERIALやBIGSERIALといったPostgreSQLの連番型をサポートしていません。

これはつまり、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);
}

使用可能なタグ <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>