Doctrine2 Symfony2在多个数据库上的迁移

时间:2014-10-11 15:51:58

标签: symfony doctrine-orm

我在使用Symfony2和Doctrine的非默认数据库上进行数据库迁移时遇到了一些麻烦。

我有两个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个中的第一个(它们都是旧的并且已经应用​​)。因为我已经指定了 - 它跨越了迁移,我想不想与我一起工作的数据库一起运行。似乎没有另一个命令行选项来指定一个包,就像生成其他迁移命令一样。我想忽略DefaultBundle,只是从我的SecondBundle运行我的迁移。

2 个答案:

答案 0 :(得分:3)

解决方法是你必须运行两次迁移,每次运行一次--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");
    }


}

答案 1 :(得分:0)

我最近也遇到了这个问题。

doctrine:fixtures:load尝试清除您传递给该实体管理器的数据库时出现了问题,但由于无法找到存储在另一个实体管理器中的特定表,因此问题失败了数据库中。

要避免此问题,您可以使用密钥--append。 例如:

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

这个关键意味着您的数据库不会被清除,因此固定装置将加载现有数据。

仅当灯具仅为second连接加载数据时才有效。

我认为你可以通过传递到--fixtures密钥,fixtures目录(但我不确定)来避免这种情况。

在我的情况下,我有2个数据库和2个连接(defaultnot_default),但我只有default连接的固定装置,所以这对我很有用。