使用带有Symfony2的doctrine2迁移多个数据库

时间:2011-07-27 12:19:07

标签: migration doctrine-orm multiple-databases

我在symfony2 + doctrine2中有2个数据库db1和db2,两个数据库在表及其字段方面彼此不同。 我需要处理迁移问题。只要有一个数据库,事情就可以正常工作。 但是当有多个数据库时,它不起作用。

另外, 有什么方法可以提供实体管理器特定的迁移设置。 要么 有什么办法可以在迁移类中提供连接或实体管理器。

请帮助。

谢谢..

3 个答案:

答案 0 :(得分:14)

您可以在迁移任务中使用--em = name选项提供entityManager。我还添加了这段代码,以避免错误地在另一个db上执行迁移:

    $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添加到所有迁移中,这样您就可以在数据库中无需担心迁移。

答案 1 :(得分:3)

这个问题有点老了,但是当我问同样的事情时,它首先出现了。我在Doctrine migrations configuration docs找到了答案。假设您有两个数据库的连接,每个数据库都有自己的实体管理器(这里使用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"

答案 2 :(得分:0)

类似的问题和解决方案:Symfony2 - Change Migration Directory

您可以为第二个数据库创建另一个迁移文件夹,并将迁移放入其中。