gpt4 book ai didi

symfony2 : multiple DB connections/entity managers with doctrine migrations & schema_filter

转载 作者:行者123 更新时间:2023-12-02 10:44:12 32 4
gpt4 key购买 nike

我目前有一个数据库/实体管理器 symfony2 (2.1) 应用程序工作得很好,包括学说迁移。我正在添加第二个数据库连接+实体管理器,但在让学说迁移执行我想要的操作时遇到困难。

本质上,我希望我的大部分实体都位于我的第一个“默认”数据库中,并在我的第二个数据库中拥有几个新实体/表 - 然后让学说迁移管理对模式的任何更改。该文档似乎暗示您可以在连接上设置“schema_filter”来实现此目的。

(用例是这样的:我们的应用程序有多个针对白标经销商的安装,每个都有自己的主数据库。但是,我们正在实现交互式帮助,该帮助将由我们以 CMS/博客类型编写接口(interface)并可通过第二个数据库供所有安装使用。)

到目前为止,我的学说配置如下所示(来自 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?还有其他方法可以实现我的目标吗?

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

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

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

最佳答案

所以,我学到了一些东西来帮助我解决这个问题......在这里发帖以防其他人陷入类似的困境。

  1. doctrine:migrations:migrate 或多或少会忽略您的 schema_filter。这可能就是它应该做的...它的工作只是在迁移文件中运行 SQL。
  2. doctrine:migrations:diff 是您应该担心 schema_filter 的地方。它将通过 schema_filter 的视角查看数据库的当前状态。请记住通过 --em=[name] 将正确的实体管理器传递给 diff 命令以及 migrate 命令。
  3. 请勿使用 schema_filter 排除 migration_versions 表。如果这样做,学说迁移包会认为它不存在,并且总是尝试重新创建它(这会失败)。

因此,我添加了两件事来或多或少地实现我的目标。在我的第二个数据库的配置中,我调整了 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() 方法中。

关于symfony2 : multiple DB connections/entity managers with doctrine migrations & schema_filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092444/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com