6

次のように作成されたテーブルを持つ既存のPostgreSQLデータベースがありました。

CREATE TABLE product (id SERIAL PRIMARY KEY, name VARCHAR(100) DEFAULT NULL)

このテーブルは、Symfony2プロジェクト内のYMLDoctrine2ファイルで説明されています。

Acme\DemoBundle\Entity\Product:
    type: entity
    table: product
    fields:
        id:
            id: true
            type: integer
            nullable: false
            generator:
                strategy: SEQUENCE
        name:
            type: string
            length: 100
            nullable: true

Doctrine Migrations diffタスクを初めて実行するとき、upanddownメソッドにデータがないバージョン管理ファイルを取得する必要があります。しかし、代わりに私が得るのはこれです:

// ...

class Version20120807125808 extends AbstractMigration
{
    public function up(Schema $schema)
    {
        // this up() migration is autogenerated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");

        $this->addSql("ALTER TABLE product ALTER id DROP DEFAULT");
    }

    public function down(Schema $schema)
    {
        // this down() migration is autogenerated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");

        $this->addSql("CREATE SEQUENCE product_id_seq");
        $this->addSql("SELECT setval('product_id_seq', (SELECT MAX(id) FROM product))");
        $this->addSql("ALTER TABLE product ALTER id SET DEFAULT nextval('product_id_seq')");
    }
}

なぜ違いが検出されるのですか?どうすればこれを回避できますか?私はいくつかのシーケンス戦略を試しましたが、成功しませんでした。

4

3 に答える 3

5

この質問に関するちょっとした更新。

Doctrine 2.4を使用する場合の解決策は、IDENTITYジェネレーター戦略を使用することです。

Acme\DemoBundle\Entity\Product:
    type: entity
    table: product
    id:
        type: integer
        generator:
            strategy: IDENTITY
    fields:
        name:
            type: string
            length: 100
            nullable: true

DROP DEFAULTデータベースにデフォルト値があるフィールドを回避するdefaultには、フィールドのオプションを使用します。もちろん、これはライフサイクルコールバックを使用して実行できますが、このデータベースが他のアプリで使用されている場合は、データベースのデフォルト値を維持する必要があります。

デフォルト値のような「DEFAULTNOW()」の場合、解決策は次のとおりです。

Acme\DemoBundle\Entity\Product:
    type: entity
    table: product
    id:
        type: integer
        generator:
            strategy: IDENTITY
    fields:
        creation_date:
            type: datetime
            nullable: false
            options:
                default: CURRENT_TIMESTAMP
于 2014-04-09T13:10:54.020 に答える
2

Doctrine2.0はSQLDEFAULTキーワードをサポートしておらず、常にpostgresのデフォルト値を削除しようとします。

この問題の解決策は見つかりませんでした。doctrineにシーケンス自体を処理させるだけです。

于 2012-11-23T05:53:16.197 に答える
1

これはここに登録されている未解決のバグです:

http://www.doctrine-project.org/jira/browse/DBAL-903

于 2015-07-14T16:14:42.757 に答える