@Lobanov

Подсоединиться к другой схеме Symfony — Doctrine?

Всем привет.

Ребят, вопрос весьма простой с одной стороны, но что-то найти не могу в доках решение и нагуглить ничего не получается.

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

Встречал на просторах инета решение через атрибуты указывать схему в самом классе Entity, но есть нюанс, что если позже надо будет переехать в отдельную базу данных - нужно будет перелопачивать множество сущностей и убирать этот атрибут. Есть ли какое-то элегантное решение данного вопроса? Может кто-то сталкивался с такой задачей?

Заранее благодарю за подсказку.
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
@Lobanov Автор вопроса
Кто-то написал ответ, но удалил его, на почту пришло уведомление, надеюсь автор найдется и я смогу отметить его комментарий решением, т.к. пришлось пойти его путём.

У меня Symfony 6.4.3 установлен orm-pack (этот пакет подтянул Doctrine v. 2.17).

Я хотел на верхнем уровне, в настройках doctrine.yaml указать свою схему PostgreSQL, чтобы Doctrine сразу в этой схеме работала, но к сожалению не нашел быстрого решения для такой реализации. На просторах stackoverflow встретил такое решение, но отмеченный галочкой ответ мне не совсем по душе, поэтому решил воспользоваться комментарием от неизвестного комментатора и плюс это же решение предложено на странице stackoverflow.

В общем, у сущности буду указывать атрибут #[ORM\Table(name: 'schema_name')] - этот атрибут будет говорить Doctrine, что нужно создать сущность в схеме под именем schema_name. Но тут появляется другая проблема, таблица для отслеживания миграций появляется в схеме public, т.е. таблицы сущностей в одной схеме, а таблица миграций в другой схеме.

Меня этот расклад не устроил, мне нужно чтобы все таблицы лежали в одной схеме, поэтому в файл config/packages/doctrine_migrations.yaml добавил в самом верху раздел storage

storage:
      # Default (SQL table) metadata storage configuration
      table_storage:
        table_name: '%env(resolve:SCHEMA_NAME)%.doctrine_migration_versions'


Также хотел, чтобы название схемы для миграций задавалось не в yaml файле, а в переменной, задействовал файл .env, в нем сделал переменную SCHEMA_NAME в которой указал схему. В результате миграции создаются в нужной мне схеме.

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

Надеюсь это кому-нибудь поможет) И неизвестный комментатор, продублируй пожалуйста свой ответ, чтобы я его отметил решением, т.к. твой ответ лег в основу моего решения.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Можно на уровне пользователя в базе установить параметр search_path, в котором задать список схем.
Ответ написан
Ваш ответ на вопрос

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

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