Jos*_*osh 5 schema filter symfony doctrine-migrations
我目前有一个单一的数据库/实体管理器symfony2(2.1)应用程序正常工作,包括doctrine迁移.我正在添加第二个数据库连接+实体管理器,并且无法让doctrine迁移做我想做的事情.
从本质上讲,我希望我的大多数实体都存在于我的第一个"默认"数据库中,并且在我的第二个数据库中有几个新的实体/表 - 然后让学说迁移管理对模式的任何更改.文档似乎暗示您可以在连接上设置'schema_filter'来实现此目的.
(用例是这样的:我们的应用程序有几个安装用于白标经销商,每个经销商都有自己的主数据库.但是,我们正在实施交互式帮助,这将由我们在CMS /博客类型界面中编写并可用,通过第二个数据库,到所有安装.)
到目前为止,我的学说配置看起来像这样(来自app/config/config.yml):
dbal:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
schema_filter: ~^(?!help_)~
cross_site:
driver: %crossite_database_driver%
host: %crossite_database_host%
port: %crossite_database_port%
dbname: %crossite_database_name%
user: %crossite_database_user%
password: %crossite_database_password%
charset: UTF8
schema_filter: ~^help_~
orm:
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
<most of the bundles>
help:
connection: cross_site
mappings:
HelpBundle: ~
Run Code Online (Sandbox Code Playgroud)
目的是将大多数实体/表放在"默认"数据库中,但排除任何以"help_"开头的表.相反,第二个数据库应该只包含那些以"help_"开头的表.
但是,每当我使用任一实体管理器运行一个学说迁移时,它都会包含所有表,而不管它们的名称如何.
php app/console doctrine:migrations:migrate # includes every table including help_*
php app/console doctrine:migrations:migrate --em="help" # includes every table
Run Code Online (Sandbox Code Playgroud)
我错误地使用了schema_filter吗?还有另一种方法来实现我的目标吗?
更新:实际上更糟糕......在使用"帮助"实体管理器进行第一次迁移后,我无法再使用--em ="help"运行其他迁移; 我收到此错误:
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migration_versions' already exists
Run Code Online (Sandbox Code Playgroud)
对原始EM的迁移继续正常工作.救命?
所以,我学到了几个帮助我解决这个问题的事情......发布在这里以防万一其他人陷入类似的纠结.
所以,我添加了两件事来或多或少地实现我的目标.在我的第二个数据库的配置中,我调整了schema_filter以包含migration_versions表:
cross_site:
schema_filter: ~^(help_|migration_versions)~
Run Code Online (Sandbox Code Playgroud)
我还将以下代码添加到处理此第二个数据库/实体管理器的任何迁移版本文件(在app/DoctrineMigrations中):
$this->skipIf( $this->connection->getDatabase() != '[second DB name]', 'Skipping help database.' );
Run Code Online (Sandbox Code Playgroud)
这确保了不应该只在第二个数据库中的表都不会污染原始数据库.请注意,这应该同时包含up()和down()方法.
归档时间: |
|
查看次数: |
3834 次 |
最近记录: |