2012-08-07 11 views
5

que tenía una base de datos PostgreSQL existente con una tabla creada de esta manera:Cómo evitar declaraciones DROP DEFAULT con Doctrine 2 Migrations diff en la primera ejecución?

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

En esta tabla se describe en un archivo YML Doctrine2 dentro de un proyecto Symfony2:

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 

Cuando corro por primera vez la tarea de diferencias Doctrine Migrations, debería obtener un archivo de versiones sin datos en los métodos up y down. Pero lo que obtengo es esto:

// ... 

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

¿Por qué se detectan diferencias? ¿Cómo puedo evitar esto? Intenté varias estrategias de secuencia sin éxito.

Respuesta

4

Una pequeña actualización de esta pregunta.

Usando Doctrina 2.4, la solución es utilizar la estrategia IDENTITY generador:

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

Para evitar DROP DEFAULT en campos que tienen un valor por defecto en la base de datos, la opción default en el campo es el camino ir. Por supuesto, esto se puede hacer con devoluciones de llamadas del ciclo de vida, pero es necesario mantener el valor predeterminado en la base de datos si esta es utilizada por otras aplicaciones.

Para un "DEFAULT NOW()" como valor por defecto, la solución es la siguiente:

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

+0

¡Gracias por tan valiosa respuesta! –

+0

@VaheShadunts ¡De nada! –

2

Doctrine 2.0 no es compatible con la palabra clave SQL DEFAULT, y siempre intentará soltar un valor predeterminado de postgres.

No he encontrado ninguna solución a este problema, simplemente dejo que doctrine maneje las secuencias.

0

no tengo respuesta, tengo una pregunta.

Si uso estrategia: IDENTIDAD de entonces hasta la migración todo está bien, pero en la doctrina de migración por tratar de CREAR SECUENCIA:

<!-- language: php --> 
<?php 

namespace Application\Migrations; 

use Doctrine\DBAL\Migrations\AbstractMigration; 
use Doctrine\DBAL\Schema\Schema; 

/** 
* Auto-generated Migration: Please modify to your needs! 
*/ 
class Version20141017144825 extends AbstractMigration 
{ 
    public function up(Schema $schema) 
    { 
     // this up() migration is auto-generated, please modify it to your needs 

    } 

    public function down(Schema $schema) 
    { 
     // this down() migration is auto-generated, please modify it to your needs 
     $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); 

     $this->addSql('CREATE SEQUENCE table_1_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); 
     $this->addSql('CREATE SEQUENCE table_2_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); 
     $this->addSql('CREATE SEQUENCE table_3_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); 
    } 
} 

Cómo desactivar la generación CREAR SECUENCIA en abajo la migración ?

que utilizo:

  • Symfony v2.5.5
  • doctrina v1.2.0
  • doctrina migraciones de haz de dev-master 81575a4