Aji*_*ngh 8 migration multiple-databases doctrine-orm
我在symfony2 + doctrine2中有2个数据库db1和db2,两个数据库在表及其字段方面彼此不同.我需要处理迁移问题.只要有一个数据库,事情就可以正常工作.但是当有多个数据库时,它不起作用.
此外,有什么方法可以提供实体管理器特定的迁移设置.或者有什么办法可以在迁移类中提供连接或实体管理器.
请帮助.
谢谢..
wde*_*dev 15
您可以在迁移任务中使用--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'
);
Run Code Online (Sandbox Code Playgroud)
我还没有找到任何其他方法来检查EM,所以如果您的数据库具有相同的名称,我无法帮助您.
另请注意,您应该将skipIf添加到所有迁移中,这样您就可以在两个数据库中无需担心迁移.
这个问题有点旧,但是当我问同样的事情时,它首先出现。我在《Doctrine迁移》配置文档中找到了答案。假设您有两个数据库的连接,每个数据库都有自己的实体管理器(此处用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
Run Code Online (Sandbox Code Playgroud)
然后,您将不包含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
Run Code Online (Sandbox Code Playgroud)
然后,无论何时运行任何迁移命令,都要同时指定实体管理器和配置:
bin/console doctrine:migrations:status --env=dev --em=special --configuration=src/MyBundle/Resources/config/migrations/special.yml
Run Code Online (Sandbox Code Playgroud)
如果要手动运行,要记住一点,因此您可能希望将它们包装在自己的命令中以使生活变得轻松(例如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"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4979 次 |
最近记录: |