Миграция нескольких баз данных с использованием doctrine2 с Symfony2 - PullRequest
7 голосов
/ 27 июля 2011

У меня есть 2 базы данных db1 и db2 в symfony2 + doctrine2, и обе базы данных отличаются друг от друга с точки зрения таблиц и их полей. Мне нужно работать над миграцией. Все работает хорошо, пока есть одна база данных. Но это не работает, когда существует более одной базы данных.

Кроме того, Есть ли способ, где я могу предоставить конкретные параметры миграции менеджера сущностей. Или же Есть ли способ, с помощью которого я могу предоставить соединение или менеджер сущностей в классе миграции.

Пожалуйста, помогите.

Спасибо ..

Ответы [ 3 ]

14 голосов
/ 04 октября 2011

Вы можете предоставить entityManager, используя опцию --em = name в задаче миграции.Я также добавляю этот фрагмент кода, чтобы избежать ошибочного выполнения миграции на другой БД:

    $parameters = $this->connection->getParams();
    $this->skipIf(
        $parameters['dbname'] != "my_db_name"
        'This is the other DB\'s migration, pass a correct --em parameter'
    );

Я не нашел другого способа проверить EM, поэтому я не могу помочь вам, есливаши базы данных имеют одинаковые имена.

Также обратите внимание, что вы должны добавить skipIf ко всем вашим миграциям, чтобы вы могли без проблем мигрировать в обе ваши базы данных.

5 голосов
/ 03 января 2017

Этот вопрос немного старый, но он возник первым, когда я спрашивал о том же.Я нашел свой ответ в документации по миграции доктрины .Допустим, у вас есть соединения для двух баз данных, каждая из которых имеет свои собственные менеджеры сущностей (сопоставленные здесь с XML, а не с аннотациями и не сопоставленные автоматически, поэтому конфигурации схемы могут находиться в одном и том же пути config/doctrine):

# config.yml
doctrine:
dbal:
    default_connection: default
    connections:
        default:
            driver: '%database_driver%'
            ...
        special:
            driver: '%special_database_driver%'
orm:
    entity_managers:
        default:
            auto_mapping: false
            mappings:
                base:
                    type: xml
                    dir: '%kernel.root_dir%/../src/MyBundle/Resources/config/doctrine/base'
                    prefix: MyBundle\Entity
                    alias: Base
                    is_bundle: false
        special:
            auto_mapping: false
            connection: special
            mappings:
                special:
                    type: xml
                    dir: '%kernel.root_dir%/../src/MyBundle/Resources/config/doctrine/special'
                    prefix: MyBundle\Special
                    alias: Special
                    is_bundle: false

Тогда не включает конфигурации doctrine_migrations в config.yml.Вместо этого создайте файл конфигурации для каждого из них:

# src/MyBundle/Resources/config/migrations/base.yml
name: BaseMigrations
migrations_namespace: MyBundle\Migrations\Base
table_name: Migrations
migrations_directory: src/MyBundle/Migrations/Base

# src/MyBundle/Resources/config/migrations/special.yml
name: SpecialMigrations
migrations_namespace: MyBundle\Migrations\Special
table_name: Migrations
migrations_directory: src/MyBundle/Migrations/Special

Затем, всякий раз, когда вы запускаете какую-либо команду миграции, задайте и менеджер сущностей, и конфигурацию:

bin/console doctrine:migrations:status --env=dev --em=special --configuration=src/MyBundle/Resources/config/migrations/special.yml

Это немного, чтобы запомнитьесли вы работаете вручную, вы можете заключить их в собственную команду, чтобы упростить жизнь (например, что-то вроде bin/console my:migrations:status --env=dev --db=special).Это также не проблема, если у вас есть сценарий развертывания bash, например:

#!/bin/bash
ENVIRONMENT="$1"

# Run migrations for a configuration
function runMigrations()
{
    local CONFIG="$1"
    local MANAGER="$2"
    local STATUS="$(bin/console doctrine:migrations:status --env=${ENVIRONMENT} --configuration=${CONFIG} --em=${MANAGER})"

    case "${STATUS}" in
        *"Already at latest version"*)
            # Do nothing
            ;;
        *)
            runNextMigration $CONFIG $MANAGER
            ;;
    esac
}

# Run the next migration for a configuration
function runNextMigration()
{
    local CONFIG="$1"
    local MANAGER="$2"
    bin/console doctrine:migrations:migrate next --env=$ENVIRONMENT --configuration=$CONFIG --em=$MANAGER

    runMigrations $CONFIG $MANAGER
}

runMigrations "src/MyBundle/Resources/config/migrations/base.yml" "default"
runMigrations "src/MyBundle/Resources/config/migrations/special.yml" "special"
0 голосов
/ 22 декабря 2015

Аналогичная проблема и решение: Symfony2 - Изменить каталог миграции

Вы можете создать другую папку миграции для второй БД и поместить миграции внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...