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私のデフォルト言語を指す接続が 1 つあります。他のすべてのデータベースは、私のデフォルトとまったく同じ構造を持っています。すべてgeneral-schema.xmlのモデルが構成されています。

propel:migration:generate-diff問題は、差分 ( ) を生成するか、移行 ( ) を実行しようとしたときに始まりますpropel:migration:migrate。Propel はそれらの接続が兄弟であることを認識せず、接続に関連するものgeneralもすべての接続で実行する必要がありますLANG_general。また、差分を行う場合、デフォルトのデータベースのみがスキーマ/モデルと比較されるため、整合性は保証できません。

私はしたいと思います:

  • すべてのデータベースが同じ構造であることを確認してください
  • すべての新しい変更を接続のグループに一度に追加し、面倒なことはしません

できれば Propel 独自のメカニズムを使用して、書籍による解決策を探していますが、すべての提案を受け付けています。何でも動作し、安定しています。意見、コメント、実証済みのソリューションは大歓迎です! ソースコードを高く評価

4

2 に答える 2

1

私は最近、Propel 1.7.x の移行に取り組んでいますが、不思議なことに、私がアンチ機能と見なしているものは、あなたの場合に非常に役立つかもしれません. ファイルを追加するとbuildtime-conf.xml(ファイルと同じ形式を使用runtime-conf.xml)、一度に移行される複数の接続を追加できます。

これらのそれぞれに対してテーブルが作成されていることを確認する必要があるpropel_migrationため、それらは個別に処理されます。

別の質問で概説したように、開発者が移行する接続を指定する方が理にかなっていると思います(したがって、環境ごとに移行を許可します)。

これが Propel2 でどのように実装されるかを見るのは興味深いでしょう (この問題について何か考えがある場合は、今がチケットを上げる良い機会です: 現在アルファ版であり、ベータ版は少し先です)。

于 2015-02-06T22:27:04.513 に答える
1

これまでに私が考え出したこと:

  • generate-diffコマンドを独自にラップし、移行クラスを変更して、すべての接続にわたってすべての SQL ステートメントをコピーできます。つまり、次のようにします。

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

    これに:

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

    これはちょっとしたハッキン​​グであり、移行クラスの形式が変更されない限り有効です。

  • 毎回名前を変更して、接続ごとにループ内のすべての移行を適用できます。つまり、bind LANG_generalasgeneralです。結果についてはわかりません。

  • たとえば、プロセスの前にすべてのスキーマファイルをコピーすることにより、スキーマ/プロセスを何らかの形で変更して、スキーマLANG_generalに一致するようにすることができます。およびコマンドは各接続で個別に動作しますが、結果は同じですgeneral。これにはさらに時間がかかります。diffmigrate

于 2013-10-22T15:34:11.537 に答える