【发布时间】:2018-06-21 13:33:14
【问题描述】:
我在 Symfony 3.4.4 项目中使用 Doctrine ORM 2.6.1。 我的一些实例在 MySQL 数据库上运行,一些在 Postgresql 上运行,一些安装甚至可以访问 MicosoftSQL 服务器。这可以正常工作,无需对我的项目或实体进行任何特殊更改,我只需配置相应的连接参数。
但是:如果我创建迁移,迁移文件中只会创建与当前数据库连接兼容的语句。
我使用 postgres 连接进行开发,所以我只生成 postgresql 语句,例如:
class Version20180430083616 extends AbstractMigration
{
public function up(Schema $schema)
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('DELETE FROM document_category');
$this->addSql('DROP SEQUENCE document_category_id_seq CASCADE');
$this->addSql('DROP TABLE document_category');
}
public function down(Schema $schema)
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
//...
}
}
我的问题:如何告诉迁移包为每个平台创建语句,例如:
class Version20180430083616 extends AbstractMigration
{
public function up(Schema $schema)
{
// this up() migration is auto-generated, please modify it to your needs
if($this->connection->getDatabasePlatform()->getName() == 'postgresql'){
$this->addSql('DELETE FROM document');
$this->addSql('DELETE FROM document_category');
$this->addSql('DROP SEQUENCE document_category_id_seq CASCADE');
$this->addSql('DROP TABLE document_category');
} else if($this->connection->getDatabasePlatform()->getName() == 'mysql'){
...
} else if ($this->connection->getDatabasePlatform()->getName() == 'mssql') { // MicrosoftSQL ?
...
}
}
}
编辑:
所以,我认为解决我的问题的唯一方法是定义多个数据库连接和实体管理器,并始终为每种连接类型创建不同的迁移。根据this article,我可以定义几个连接为:
【问题讨论】:
-
不行,对不起。 Doctrine 的迁移工具不能这样工作。
-
感谢您的回答。我想我必须在我的开发环境中定义几个并发数据库连接,然后为每个连接创建迁移。有没有办法自动将实体写入多个数据库?
标签: doctrine doctrine-migrations