2012-08-07 21 views
5

Tôi đã có một cơ sở dữ liệu PostgreSQL hiện với một bảng được tạo như thế này:Làm thế nào để tránh các câu lệnh DROP DEFAULT với Doctrine 2 Migrations diff trong lần chạy đầu tiên?

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

Bảng này được mô tả trong một tập tin YML Doctrine2 trong một dự án 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 

Khi tôi chạy lần đầu tiên Tác vụ khác của Doctrine Migrations Migration, tôi sẽ nhận được một tệp phiên bản không có dữ liệu trong các phương thức updown. Nhưng những gì tôi nhận được thay vào đó là:

// ... 

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

Tại sao có sự khác biệt được phát hiện? Làm thế nào tôi có thể tránh điều này? Tôi đã thử một số chiến lược chuỗi không thành công.

Trả lời

4

Một cập nhật nhỏ về câu hỏi này.

Sử dụng Học thuyết 2.4, giải pháp là sử dụng chiến lược IDENTITY máy phát điện:

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

Để tránh DROP DEFAULT trên các lĩnh vực có giá trị mặc định trong cơ sở dữ liệu, các default tùy chọn trên sân là cách đi. Tất nhiên điều này có thể được thực hiện với callbacks vòng đời, nhưng nó cần thiết để giữ giá trị mặc định trong cơ sở dữ liệu nếu cơ sở dữ liệu này được sử dụng bởi các ứng dụng khác.

Đối với một "DEFAULT NOW()" như giá trị mặc định, giải pháp là một trong những sau:

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

Cảm ơn bạn đã trả lời có giá trị như vậy !! –

+0

@VaheShadunts Bạn được chào đón! –

2

Doctrine 2.0 không hỗ trợ từ khóa DEFAULT SQL và sẽ luôn cố gắng giảm giá trị mặc định của bưu điện.

Tôi đã không tìm thấy giải pháp cho vấn đề này, tôi chỉ để giáo lý xử lý các chuỗi chính nó.

0

Tôi không có câu trả lời, tôi có một câu hỏi.

Nếu tôi sử dụng chiến lược: SẮC đó trở đi lên di cư tất cả mọi thứ là ok nhưng trên học thuyết di cư xuống cố gắng CREATE SEQUENCE:

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

Làm thế nào để tắt hệ CREATE SEQUENCE tại xuống di cư ?

tôi sử dụng:

  • Symfony v2.5.5
  • thuyết v1.2.0
  • thuyết-di cư-bó dev-master 81575a4
Các vấn đề liên quan