2014-10-11 77 views
3

我在使用Symfony2和Doctrine在非默認數據庫上執行數據庫遷移時遇到了一些麻煩。Doctrine2在多個數據庫上遷移Symfony2

我有兩個dbs和兩個實體管理器,我正在使用。我有兩個捆綁包,每個捆綁適用於各自的EM,因此一切都應該相當分離。

在我的DefaultBundle下我有大約20個遷移文件的遷移,這些遷移文件都適用於默認數據庫。我的SecondBundle有一個適用於seconddb的遷移文件。

當我嘗試運行

php app/console doctrine:migrations:migrate --no-interaction --em="second" 

我越來越

Migration 20140709212101 failed during Execution. Error There is no table with name 'second_database.users' in the schema. 

    [Doctrine\DBAL\Schema\SchemaException]         
    There is no table with name 'second_database.users' in the schema. 

這完全是真實的,「用戶」是我的主數據庫的表。這裏發生的事情是,它試圖運行的遷移文件實際上是DefaultCore中的第一個20(它們都是舊的並且已經被應用)。因爲我已經指定--em它正在跨越遷移我想不想與我正在使用的db一起運行。似乎沒有另一個命令行選項來指定一個類似於其他遷移命令(如generate)的包。我想忽略DefaultBundle,只需從我的SecondBundle運行我的遷移。

+0

這看起來不像支持,但有希望(https://github.com/doctrine/DoctrineMigrationsBundle/pull/46)。你應該嘗試pvanlieflands叉子 – greg0ire 2014-10-11 17:30:29

回答

0

我最近也談到了這個問題。

問題出現了,當doctrine:fixtures:load嘗試清除您傳遞給此實體管理器的數據庫時,但由於他無法找到存儲在另一個數據庫中的特定表,而失敗。

要避免此問題,您可以使用密鑰--append。 例如:

$ php app/console doctrine:fixtures:load --em=second --append 

是找你的數據庫不會被清除,從而將燈具裝載在現有的數據這關鍵的意思。

只有在夾具僅爲second連接加載數據時,此功能纔有效。

我想你可以通過進入--fixtures鍵,夾具目錄(但我不確定)來避免這種情況。


在我的情況,我有2個數據庫和圖2(defaultnot_default),但我只爲default連接燈具所以這個罰款對我的作品。

2

對此的解決方案是,您必須運行兩次遷移,每次運行一次--em,然後在遷移本身中檢查您所在的數據庫是否應該運行。您可以進行ContainerAware遷移,以便您有權訪問。例如:

class Version201501021322 extends AbstractMigration implements ContainerAwareInterface 
{ 
    private $container; 

    public function setContainer(ContainerInterface $container = null) 
    { 
     $this->container = $container; 
    } 

    /** 
    * @param Schema $schema 
    */ 
    public function up(Schema $schema) 
    { 
     $this->skipIf($this->connection->getDatabase() != $this->container->getParameter('second_database_name'), 'Skipping database.'); 

     $this->addsql("//migration here"); 
    } 


}