我在使用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运行我的迁移。
答案 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个连接(default
,not_default
),但我只有default
连接的固定装置,所以这对我很有用。