symfony2 + doctrine2 に 2 つのデータベース db1 と db2 があり、両方のデータベースはテーブルとそのフィールドに関して互いに異なります。
移行に取り組む必要があります。データベースが 1 つある限り、問題なく動作します。
ただし、複数のデータベースがある場合は機能しません。
また、エンティティ マネージャー固有の移行設定を提供できる方法はありますか。
または、移行クラスで接続またはエンティティ マネージャーを提供できる方法はありますか。
symfony2 + doctrine2 に 2 つのデータベース db1 と db2 があり、両方のデータベースはテーブルとそのフィールドに関して互いに異なります。
移行に取り組む必要があります。データベースが 1 つある限り、問題なく動作します。
ただし、複数のデータベースがある場合は機能しません。
また、エンティティ マネージャー固有の移行設定を提供できる方法はありますか。
または、移行クラスで接続またはエンティティ マネージャーを提供できる方法はありますか。
移行タスクで --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 を追加する必要があることに注意してください。
この質問は少し古いですが、同じことを尋ねていたときに最初に出てきました。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_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"
同様の問題と解決策: Symfony2 - 移行ディレクトリの変更
2 番目の DB 用に別の移行フォルダーを作成し、その中に移行を入れることができます。