Учение порождает-мигрирует-дифференцирует и мигрирует - PullRequest
3 голосов
/ 17 июня 2010

Я попытался выполнить команду cli ./doctrine generate-migrations-diff, и файл версии был правильно создан в нужной папке.

Сообщение: generate-migrations-diff - успешно сгенерированные классы миграции из разницы

Затем я пытаюсь выполнить другую команду cli ./doctrine migrate, и мне кажется, что сообщение: migrate - успешно перенесено в версию # 1 , но когда я открываю класс, любые изменения были сделаны. Почему?

Это файл версии1:

<?php

class Version1 extends Doctrine_Migration_Base
{
public function up()
{
    $this->removeColumn('addresses', 'address_test');
}

public function down()
{
    $this->addColumn('addresses', 'address_test', 'string', '', array(
         'fixed' => '0',
         'unsigned' => '',
         'primary' => '',
         'notnull' => '1',
         'autoincrement' => '',
         ));
}
}

?>

Это ЯМЛ. Я удалил поле: address_test

Addresses:
  connection: doctrine
  tableName: addresses
  columns:
    address_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    address:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    city:
      type: string(150)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    code:
      type: string(20)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    country_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    base:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false
    latitude:
      type: string(20)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    longitude:
      type: string(20)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    customer_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false

Это класс BaseAddresses, сгенерированный командой migrate : bindComponent («Адреса», «Доктрина»);

/**
 * BaseAddresses
 * 
 * This class has been auto-generated by the Doctrine ORM Framework
 * 
 * @property integer $address_id
 * @property string $address
 * @property string $city
 * @property string $code
 * @property integer $country_id
 * @property integer $base
 * @property string $latitude
 * @property string $longitude
 * @property integer $customer_id
 * @property Countries $Countries
 * @property Customers $Customers
 * 
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## <##EMAIL##>
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
abstract class BaseAddresses extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('addresses');
        $this->hasColumn('address_id', 'integer', 4, array(
             'type' => 'integer',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => true,
             'autoincrement' => true,
             'length' => '4',
             ));
        $this->hasColumn('address', 'string', null, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             'length' => '',
             ));
        $this->hasColumn('city', 'string', 150, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             'length' => '150',
             ));
        $this->hasColumn('code', 'string', 20, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             'length' => '20',
             ));
        $this->hasColumn('country_id', 'integer', 4, array(
             'type' => 'integer',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             'length' => '4',
             ));
        $this->hasColumn('base', 'integer', 1, array(
             'type' => 'integer',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'default' => '0',
             'notnull' => true,
             'autoincrement' => false,
             'length' => '1',
             ));
        $this->hasColumn('latitude', 'string', 20, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             'length' => '20',
             ));
        $this->hasColumn('longitude', 'string', 20, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             'length' => '20',
             ));
        $this->hasColumn('customer_id', 'integer', 4, array(
             'type' => 'integer',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '4',
             ));
    }

    public function setUp()
    {
        parent::setUp();
        $this->hasOne('Countries', array(
             'local' => 'country_id',
             'foreign' => 'country_id'));

        $this->hasOne('Customers', array(
             'local' => 'customer_id',
             'foreign' => 'customer_id',
             'onDelete' => 'CASCADE'));
    }
}

На каком-то веб-сайте я прочитал, что мне нужно выполнить команду: build-all , чтобы сгенерировать обновленную версию адресов классов, но я получаю эту ошибку:

SQLSTATE[HY000]: General error: 1005 Can't create table 'web63db1.#sql-3e6_11d' (errno: 121). Failing Query: "ALTER TABLE addresses ADD CONSTRAINT addresses_customer_id_customers_customer_id FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE". Failing Query: ALTER TABLE addresses ADD CONSTRAINT addresses_customer_id_customers_customer_id FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE

Что мне делать? Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 30 июня 2010

Миграции предназначены только для изменения базы данных, а не классов модели.После этого вам необходимо построить классы моделей.

Таким образом, ваш обычный способ работы будет следующим:

  1. Измените ваш schema.yml
  2. Создайте свой файл миграции-migrations-diff)
  3. Запустите миграцию для базы данных (перенастроить), теперь ваша база данных должна быть изменена
  4. Обновите классы моделей (build-all)
1 голос
/ 31 июля 2012

Поскольку я не могу комментировать, позвольте мне изменить ответ Тимо:

  1. Изменить схему.yml
  2. Создать файл миграции (doctrine: generate-migrations-diff) (Примечание: это сравнение схемы с файлами классов )
  3. Запустите миграцию (doctrine: migrate) (она запускается на основе номера версии миграции в вашей базе данных)
  4. Создайте свои файлы классов. (doctrine: build --all-classes ИЛИ doctrine: build-model & doctrine: build-forms & doctrine: build-filters) (Примечание: это создаст все ваши файлы классов, но не будет пытаться обновить ваша база данных.)

Я настоятельно рекомендую выполнить резервное копирование базы данных перед первым выполнением любых миграций. Если миграция завершится неудачно (то есть, потому что вы опечатали свою схему), вы можете получить базу данных, которая застряла между миграциями и ее нужно будет удалить. Я обычно делаю резервную копию моей test-db и затем импортирую live db, чтобы проверить миграцию. Я более чем напуган сбоем миграции на работающем сервере.

Важно отметить, что doctrine: generate-migrations-diff сравнивает schema.yml с вашими сгенерированными в настоящее время файлами классов. Не создавайте свои классы до генерации миграции

Для развертывания на сервере вам необходимо загрузить свой schema.yml и новые файлы миграции. Затем просто выполните шаги 3 и 4 (а затем очистите кэш по привычке), и все готово.

...