トップ » サービス » 技術情報 » symfony » その他 » PropelはPostgreSQLのSERIALをサポートしていない!?
symfony

PropelはPostgreSQLのSERIALをサポートしていない!? - 記述日2008/2/5 - 綿引


どうもDBのカラムにSerial型を指定するとインサートがうまくいかない…(カウントアップされず0が入る) WEBで調べてみると以下の記事を発見。


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);
}


ということで、モデルクラスが正常に作成されていればsymfony側で自動カウントアップを行っているので大丈夫らしい。
自分の場合は、synfonyコマンドでモデルクラスを作成した際、schema.ymlの記述が間違っていたのが原因だった。

※schema.ymlの記述

banner_id:
  type: INTEGER
  required: true
  autoIncrement: true
  primaryKey: true

primaryKeyだけでなく、autoIncrementをtrueにしないとシーケンスが作成されず、symfony側も自動カウントアップを行ってくれない。

※実際に処理を行っているのは下記ファイル

/usr/share/pear/symfony/vendor/propel/util/BasePeer.php


symfony 最新記事

↑Pagetop