8

symfony2 + doctrine2 に 2 つのデータベース db1 と db2 があり、両方のデータベースはテーブルとそのフィールドに関して互いに異なります。

移行に取り組む必要があります。データベースが 1 つある限り、問題なく動作します。

ただし、複数のデータベースがある場合は機能しません。

また、エンティティ マネージャー固有の移行設定を提供できる方法はありますか。

または、移行クラスで接続またはエンティティ マネージャーを提供できる方法はありますか。

4

3 に答える 3

16

移行タスクで --em=name オプションを使用して entityManager を指定できます。誤って別のデータベースで移行を実行しないように、次のコードも追加します。

    $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 を追加する必要があることに注意してください。

于 2011-10-04T15:48:23.340 に答える
8

この質問は少し古いですが、同じことを尋ねていたときに最初に出てきました。Doctrine migrations configuration docsで答えを見つけました。2 つのデータベースへの接続があり、それぞれが独自のエンティティ マネージャーを持っているとします (ここでは注釈ではなく 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_migrationsconfig.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"
于 2017-01-03T00:28:19.687 に答える
0

同様の問題と解決策: Symfony2 - 移行ディレクトリの変更

2 番目の DB 用に別の移行フォルダーを作成し、その中に移行を入れることができます。

于 2015-12-22T11:34:13.977 に答える