2013-09-30 28 views
4

我目前有一個單一的數據庫/實體管理器symfony2(2.1)應用程序工作得很好,包括教條遷移。我正在添加第二個數據庫連接+實體管理器,並且無法獲得理論遷移來執行我想要的操作。從本質上講,我希望我的大多數實體能夠存在於我的第一個'默認'數據庫中,並且在我的第二個數據庫中有幾個新的實體/表格 - 然後讓doctrine migrations管理對模式的任何更改。文檔似乎暗示你可以在連接上設置一個'schema_filter'來實現這一點。 (使用案例是這樣的:我們的應用程序有幾個安裝程序,用於白色標記的代理商,每個代理商都有自己的主數據庫。但是,我們正在實施交互式幫助,這些交互式幫助將由我們在CMS /博客接口類型和可用的,通過這第二個數據庫,所有的安裝)symfony2:多個數據庫連接/實體經理與教條遷移&schema_filter

到目前爲止,我的學說的配置看起來像這樣(從應用程序/配置/ config.yml):

dbal: 
     default: 
      driver: %database_driver% 
      host:  %database_host% 
      port:  %database_port% 
      dbname: %database_name% 
      user:  %database_user% 
      password: %database_password% 
      charset: UTF8 
      schema_filter: ~^(?!help_)~ 
     cross_site: 
      driver: %crossite_database_driver% 
      host:  %crossite_database_host% 
      port:  %crossite_database_port% 
      dbname: %crossite_database_name% 
      user:  %crossite_database_user% 
      password: %crossite_database_password% 
      charset: UTF8 
      schema_filter: ~^help_~ 

orm: 
    auto_generate_proxy_classes: %kernel.debug% 
    default_entity_manager: default 
    entity_managers: 
     default: 
      connection: default 
      mappings: 
       <most of the bundles> 
     help: 
      connection: cross_site 
      mappings: 
       HelpBundle: ~ 

的目的是使「默認」數據庫中的大部分實體/表格,但不包括任何表格用'help_'滾動。相反,第二個數據庫應該包含只有這些表以'help_'開頭。

但是,無論何時使用任一實體管理器運行學說遷移,它都將包含所有表,而不考慮其名稱。

php app/console doctrine:migrations:migrate # includes every table including help_* 
php app/console doctrine:migrations:migrate --em="help" # includes every table 

我錯用了schema_filter嗎?有另一種方法來實現我的目標嗎?

更新:這實際上更糟糕......在使用'help'實體管理器進行第一次遷移後,我不再能夠使用--em =「help」運行其他遷移;我收到此錯誤:

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migration_versions' already exists 

對原始EM的遷移繼續正常工作。幫幫我?

回答

6

因此,我學到了幾件事情,幫助我解決了這個問題......在這裏發帖,以防其他人陷入類似糾紛。

  1. 學說:遷移:遷移更多或更少忽略你的schema_filter。這可能是它應該做的......它的工作就是在遷移文件中運行SQL。
  2. 學說:遷移:差異是你應該擔心你的schema_filter。它將通過schema_filter的鏡頭查看數據庫的當前狀態。請記住通過--em = [name]將正確的實體管理器傳遞給diff命令以及migrate命令。
  3. 不要使用schema_filter排除migration_versions表。如果你這樣做,那麼doctrine migrations bundle會認爲它不存在,並且總是嘗試重新創建它(這將失敗)。

所以,我添加了兩件事情,或多或少的達到我的目標。在我的第二個數據庫的配置,我調整了schema_filter還包括migration_versions表:

  cross_site: 
       schema_filter: ~^(help_|migration_versions)~ 

我還添加以下代碼以任何遷移版本的文件(在應用程序/ DoctrineMigrations)與本次數據庫處理/實體管理器:

$this->skipIf($this->connection->getDatabase() != '[second DB name]', 'Skipping help database.'); 

這可確保沒有隻應在第二個數據庫中的表格會污染原始數據庫。請注意,這應該在up()和down()方法中進行。

+0

你能否詳細解釋一下你的「cross_site」配置。 – hardik