symfony2:具有学说迁移的多个数据库连接/实体管理器& schema_filter

时间:2013-09-30 10:55:28

标签: symfony filter schema 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: ~

目的是让大多数实体/表位于“默认”数据库中,但排除任何以“help_”开头的表。相反,第二个数据库应该只包含 那些以'help _'开头的表。

但是,每当我使用任一实体管理器运行学说迁移时,它都会包含所有表,无论其名称如何。

php app/console doctrine:migrations:migrate # includes every table including help_*
php app/console doctrine:migrations:migrate --em="help" # includes every table

我是否误用了schema_filter?还有另一种方法来实现我的目标吗?

更新实际上更糟糕......在使用“帮助”实体管理器进行首次迁移后,我无法再使用--em =“help”运行其他迁移;我收到此错误:

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migration_versions' already exists 

原始EM上的迁移继续正常工作。帮助

1 个答案:

答案 0 :(得分:6)

所以,我学到了一些帮助我解决这个问题的事情......发布在这里以防其他任何人陷入类似的纠结。

  1. 原则:迁移:迁移或多或少会忽略您的schema_filter 。这可能是它应该做的......它的工作就是在迁移文件中运行SQL。
  2. doctrine:migrations:diff是您应该担心schema_filter 的地方。它将通过schema_filter的镜头查看数据库的当前状态。请记住通过--em = [name]将正确的实体管理器传递给diff命令以及migrate命令。
  3. 请勿使用schema_filter 排除migration_versions表。如果这样做,doctrine迁移包将认为它不存在,并且总是尝试重新创建它(这将失败)。
  4. 所以,我添加了两件事来或多或少地实现我的目标。在我的第二个数据库的配置中,我调整了schema_filter以包含migration_versions表:

                cross_site: 
                    schema_filter: ~^(help_|migration_versions)~
    

    我还将以下代码添加到处理此第二个数据库/实体管理器的任何迁移版本文件(在app / DoctrineMigrations中):

    $this->skipIf( $this->connection->getDatabase() != '[second DB name]', 'Skipping help database.' );
    

    这确保了不应该只在第二个数据库中的表都不会污染原始数据库。请注意,这应该放在up()和down()方法中。