1

我有一个多语言应用程序,每种语言数据都在一个单独的数据库中。这是它在 Symfony 2.2 和 Propel 1.6 中的配置方式(摘自 config key propel.dbal.connections):

pl_general: &GENERAL
    <<: *BASEDB
    dsn:        mysql:host=%db_host%;dbname=%db_general%_pl%db_suffix%
general:
    <<: *GENERAL
ar_general:
    <<: *BASEDB
    dsn:        mysql:host=%db_host%;dbname=%db_general%_ar%db_suffix%
at_general:
    <<: *BASEDB
    dsn:        mysql:host=%db_host%;dbname=%db_general%_at%db_suffix%
bg_general:
    <<: *BASEDB
    dsn:        mysql:host=%db_host%;dbname=%db_general%_bg%db_suffix%

等等。有一个general连接指向我的默认语言。所有其他数据库的结构与我的默认结构完全相同。我有一个general-schema.xml配置了所有模型的。

当我尝试生成差异 ( propel:migration:generate-diff) 或执行迁移 ( propel:migration:migrate) 时,问题就开始了。Propel 不知道这些连接是同级的,与general连接相关的任何事情也应该在每个LANG_general连接上执行。此外,在进行差异时,仅将默认数据库与架构/模型进行比较,因此我无法保证完整性。

我想:

  • 确保所有数据库具有相同的结构
  • 一次将所有新更改添加到一组连接中,没有太多麻烦

我正在寻找一个按章办事的解决方案,最好使用 Propel 自己的机制,但我愿意接受所有建议。任何有效且稳定的东西。非常欢迎提出意见、评论和经过验证的解决方案!源代码赞赏

4

2 回答 2

1

到目前为止我想到了什么:

  • 可以将命令包装generate-diff在自己的文件中并更改迁移类以在我的所有连接中复制所有 SQL 语句,即转为:

    return [
      'general' => '/** STATEMENTS **/'
    ];
    

    进入这个:

    return [
      'pl_general' => '/** STATEMENTS **/',
      'at_general' => '/** STATEMENTS **/',
      'ar_general' => '/** STATEMENTS **/',
      'bg_general' => '/** STATEMENTS **/',
    ];
    

    这有点骇人听闻,只有在迁移类格式不变的情况下才有用。

  • 可以为每个连接在一个循环中应用所有迁移,每次都更改名称,即绑定LANG_generalgeneral. 我不确定后果。

  • 可以以某种方式更改模式/进程,以便任何LANG_generalgeneral模式匹配 - 例如通过在进程之前复制所有模式文件。diffand命令将migrate分别对每个连接进行操作,但结果相同。这也将更加耗时。

于 2013-10-22T15:34:11.537 回答
1

我最近一直在使用 Propel 1.7.x 迁移,奇怪的是,我认为是反功能的东西在你的情况下可能非常有用。如果您添加一个buildtime-conf.xml文件(使用与您的 相同的格式runtime-conf.xml),那么您可以添加多个将一次性迁移的连接。

您需要确保propel_migration为其中的每一个都创建了一个表,以便将它们分开处理。

正如我在另一个问题中概述的那样,我认为开发人员指定迁移哪个连接会更有意义(从而允许基于每个环境进行迁移)。

看看如何为 Propel2 实现这一点将会很有趣(如果您对此事有任何想法,现在是提出票的好时机:它目前处于 alpha 阶段,距离 beta 阶段还有一段距离)。

于 2015-02-06T22:27:04.513 回答