2013-10-22 53 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測試還有一段時間) 。