我有一个多语言应用程序,每个语言数据都在一个单独的数据库中。这是它在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自己的机制,但我对所有建议持开放态度。无论什么有效并且稳定。非常欢迎意见,评论和经过验证的解决方案!源代码赞赏
答案 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
模式 - 例如通过在进程之前复制所有模式文件。 diff
和migrate
命令将分别对每个连接进行操作,但结果相同。这也会耗费更多时间。
答案 1 :(得分:1)
我最近一直在使用Propel 1.7.x迁移,奇怪的是我认为反特征在你的情况下可能非常有用。如果您添加buildtime-conf.xml
文件(使用与runtime-conf.xml
相同的格式),则可以添加多个将一次迁移的连接。
您需要确保为每个表创建propel_migration
表,以便对它们进行单独处理。
正如我概述in another question,我认为开发人员更有意义指定迁移哪些连接(从而允许基于每个环境进行迁移)。
看看如何为Propel2实现这一点会很有意思(如果您对此事有任何想法,现在是提高票价的好时机:它目前处于alpha状态,并且测试版有些偏离)。