2012-08-07 12 views
5

miałem istniejącej bazy danych PostgreSQL z tabeli utworzonej tak:Jak uniknąć instrukcji DROP DEFAULT przy użyciu Doctrine 2 Migrations podczas pierwszego uruchomienia?

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

Tabela ta jest opisana w pliku yml Doctrine2 ramach projektu 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 

Kiedy biegnę po raz pierwszy Zadanie diff Doctrine Migrations, powinienem otrzymać plik wersjonowania bez danych w metodach up i down. Ale zamiast tego otrzymuję:

// ... 

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

Dlaczego wykryto różnice? Jak mogę tego uniknąć? Wypróbowałem kilka strategii sekwencji bez powodzenia.

Odpowiedz

4

Mała aktualizacja tego pytania.

Korzystanie Doctrine 2.4, rozwiązaniem jest stosowanie strategii IDENTITY prądotwórcze:

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

Aby uniknąć DROP DEFAULT na polach, które mają wartość domyślną w bazie danych, opcja default na polu jest droga iść. Oczywiście można tego dokonać za pomocą wywołań zwrotnych cyklu życia, ale konieczne jest zachowanie wartości domyślnej w bazie danych, jeśli ta baza danych jest używana przez inne aplikacje.

Przez "default NOW()", jak wartość domyślną, rozwiązaniem jest następujący:

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

Dziękujemy za tak cenną odpowiedź! –

+0

@VaheShadunts Nie ma za co! –

2

Doctrine 2.0 nie obsługuje słowa kluczowego SQL DEFAULT i zawsze stara się zrzucić domyślną wartość postgreSQL.

Nie znalazłem rozwiązania tego problemu, po prostu pozwoliłem doktrynie obsługiwać same sekwencje.

0

nie mam odpowiedzi, mam pytanie.

Jeśli używam strategię: Tożsamość następnie na górę migracja wszystko jest ok, ale na dół doktryny migracyjnej spróbować TWORZENIE SEKWENCJA:

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

Jak wyłączyć generowanie TWORZENIE SEKWENCJA w dół migracji ?

używam:

  • Symfony v2.5.5
  • doktryna v1.2.0
  • doktryna migracje-pakiet dev-master 81575a4
Powiązane problemy