@Lobanov

Как выбрать нужные таблицы в Symfony используя schema_filter?

Всем привет.

Ребят, сижу парюсь с регуляркой уже почти сутки. Доктрина выдает некорректный вариант.

Суть такова, что в базе уже существуют таблицы, мне нужно их исключить и выбирать мои таблицы находящиеся в нужных мне схемах PostgreSQL, при этом нужно также выбирать таблицу миграций, чтобы можно было накатывать и откатывать миграции.

У меня есть схема PostgreSQL test_project тут лежат таблицы проекта для теста, есть схема migration_tables - тут будут лежать таблицы миграций принадлежащие определенному проекту (поставили такое ТЗ, что будут использоваться схемы для разграничения таблиц по проектам, вместо отдельных баз данных)

Почитал мануалы, ответы на аналогичный вопрос, и составил вот такую регулярку и добавил в файл doctrine.yaml

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        schema_filter: '~^(shop_|migrations_tables.shop_migrations)~'


Получается так, что в схеме test_project лежат таблицы начинающиеся с shop_ а в схеме migrations_tables лежит таблица миграций shop_migrations (понимаю, что нейминг хрень, но это в качестве примера сейчас и для того, чтобы разобраться в данном вопросе)

У первой созданной сущности указал такой атрибут
#[ORM\Table(name: 'shop_book', schema: 'test_project')]

После запуска команды symfony console doctrine:migration:diff создается класс миграции с следующим содержимым:

<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20240207041324 extends AbstractMigration
{
    public function getDescription(): string
    {
        return '';
    }

    public function up(Schema $schema): void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->addSql('CREATE SCHEMA test_project');
        $this->addSql('CREATE SEQUENCE test_project.shop_book_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
        $this->addSql('CREATE TABLE test_project.shop_book (id INT NOT NULL, title VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
    }

    public function down(Schema $schema): void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->addSql('DROP SEQUENCE test_project.shop_book_id_seq CASCADE');
        $this->addSql('DROP TABLE test_project.shop_book');
    }
}


Тут все норм. Одна сущность и для нее создается таблица, все корректно. Накатываю миграцию в базу и затем если я добавляю следующую сущность shop_book_category (атрибут указываю такой #[ORM\Table(name: 'shop_book_category', schema: 'test_project')] ), затем вызываю команду symfony console doctrine:migration:diff

вот тут неожиданное поведение происходит, создается миграция в которой по-новой должна создаться таблица shop_book и после этого уже только будет создана таблица shop_book_category

<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20240207042122 extends AbstractMigration
{
    public function getDescription(): string
    {
        return '';
    }

    public function up(Schema $schema): void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->addSql('CREATE SEQUENCE test_project.shop_book_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
        $this->addSql('CREATE SEQUENCE test_project.shop_book_category_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
        $this->addSql('CREATE TABLE test_project.shop_book (id INT NOT NULL, title VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
        $this->addSql('CREATE TABLE test_project.shop_book_category (id INT NOT NULL, title VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
    }

    public function down(Schema $schema): void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->addSql('DROP SEQUENCE test_project.shop_book_id_seq CASCADE');
        $this->addSql('DROP SEQUENCE test_project.shop_book_category_id_seq CASCADE');
        $this->addSql('DROP TABLE test_project.shop_book');
        $this->addSql('DROP TABLE test_project.shop_book_category');
    }
}


Т.е. происходит накопительный эффект, который не желателен, может кто-то решал подобную задачу? Буду благодарен, если поделитесь решением, а то голову сломал, почему такое происходит(((
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 1
svisch
@svisch
Чтобы не было, как вы пишите, "накопительного эффекта в миграциях" их надо выполнять - doctrine:migrations:migrate
После этого создадутся необходимые таблицы. А так доктрина каждый раз сопоставляет сущности с тем что есть в бд и исходя из этого делает класс миграции.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы