2013-10-22 28 views
1

我有一个多语言应用程序,每个语言数据在一个单独的数据库中。这是它是如何在Symfony的2.2配置和(从配置关键propel.dbal.connections节选)推进1.6:在propel中迁移多个相同的数据库

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连接有关的任何连接也应在每个连接上执行。另外,在执行差异时,只有默认数据库与架构/模型进行比较,因此我无法保证完整性。

我想:

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

我正在寻找一个通过本书的解决方案,最好使用Propel自己的机制,但我愿意接受所有建议。无论工作和稳定。意见,评论和成熟的解决方案非常受欢迎!源代码赞赏

+0

将所有语言表放在同一个数据库中可能更容易吗? – halfer

+0

我认为它会变得更糟。生成的迁移将具有'改变表用户' - 我无法轻易将它应用于'user_en','user_fr','user_es'等。 –

回答

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

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

您需要确保为每个表创建了一个propel_migration表,因此它们分开处理。

正如我已经概述in another question,我想这更有意义的开发人员指定连接被迁移(因此允许在每个环境基础上的迁移)。

有趣的是,看看这是如何实施Propel2的(如果您对此事有任何想法,现在是提高票价的好时机:它目前处于alpha阶段,beta测试还有一段时间) 。