postgresql doctrine Код в миграции $this->addSql(CREATE SCHEMA public) - Как его убрать
Primary tabs
Проблема
Генератор миграции добавляет в down() код:
$this->addSql('CREATE SCHEMA public');
-- который вообще говоря приводит к ошибке при откате (т.е. эту схему никто и не удалял)
Решение
В добавьте класс (пространство имен может быть любым):
<?php
namespace App\Symfony\Patch;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
/**
* Выключаем добавление беcполезной команды в down миграции
*/
class MigrationEventSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return array(
'postGenerateSchema',
);
}
public function postGenerateSchema(GenerateSchemaEventArgs $Args)
{
$Schema = $Args->getSchema();
if (! $Schema->hasNamespace('public')) {
$Schema->createNamespace('public');
}
}
}И зарегистрируйте его в конфиге:
# app/config/services.yml
services:
doctrineMigrationDiffListener:
class: App\Symfony\Patch\MigrationEventSubscriber
tags:
- { name: doctrine.event_subscriber, connection: default }Источник решения: https://github.com/doctrine/dbal/issues/1110#issuecomment-255765189
- Log in to post comments
- 3673 reads
BoomerOK
Sun, 12/03/2023 - 22:28
Permalink
Как сделать с аннотациями
#[When('dev')] #[AutoconfigureTag('doctrine.event_listener', ['event' => ToolEvents::postGenerateSchema])] class FixPostgreSQLDefaultSchemaListener { public function postGenerateSchema(GenerateSchemaEventArgs $args) { $schemaManager = $args->getEntityManager() ->getConnection() ->createSchemaManager(); $schema = $args->getSchema(); foreach ($schemaManager->listSchemaNames() as $namespace) { if (!$schema->hasNamespace($namespace)) { $schema->createNamespace($namespace); } } } }