在propel中迁移多个相同的数据库

时间:2013-10-22 15:34:12

标签: php symfony multilingual propel database-migration

我有一个多语言应用程序,每个语言数据都在一个单独的数据库中。这是它在Symfony 2.2和Propel 1.6中的配置(摘自配置键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配置了所有模型。

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

我想:

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

我正在寻找一本书的解决方案,最好使用Propel自己的机制,但我对所有建议持开放态度。无论什么有效并且稳定。非常欢迎意见,评论和经过验证的解决方案!源代码赞赏

2 个答案:

答案 0 :(得分:1)

到目前为止我的想法是什么:

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

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

    进入这个:

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

    这只是一些黑客行为,只要迁移类格式不会改变,它就会很好。

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

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

答案 1 :(得分:1)

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

您需要确保为每个表创建propel_migration表,以便对它们进行单独处理。

正如我概述in another question,我认为开发人员更有意义指定迁移哪些连接(从而允许基于每个环境进行迁移)。

看看如何为Propel2实现这一点会很有意思(如果您对此事有任何想法,现在是提高票价的好时机:它目前处于alpha状态,并且测试版有些偏离)。