Создание нескольких баз данных с доктриной на основе нескольких соединений - PullRequest
0 голосов
/ 19 сентября 2018

У меня возникла проблема при создании нескольких баз данных на основе нескольких соединений для целей функционального тестирования.

Я создал в приложении Symfony 3.3 из-за некоторых ограничений и обновления поддерживаемоговерсия Symfony будет запланирована.Следует помнить, что мне приходилось иметь дело с существующей базой данных PostgreSQL, особенно с 3 базами данных:

  • база данных A
  • база данных B
  • база данных C

Мне не нравится проектировать мое приложение из существующей базы данных.Обычно, когда я создаю приложение с нуля, я сначала проектирую свое приложение и все бизнес-правила, но здесь у меня не было выбора.Звучит плохо, но эта часть моего приложения разработана на основе существующей базы данных.Любое предложение в любом случае приветствуется.Итак, в папке App \ Entity я настроил сопоставление для 3 соединений:

  • сущностей, связанных с базой данных A, находятся в папке App \ Entity \ Dba
  • объекты, связанные с базой данных B, находятся в папке App \ Entity \ Dbb
  • объекты, связанные с базой данных C, в папке App \ Entity \ Dbc

При использовании flex конфигурация доктрины в файле doctrine.yaml выглядит следующим образом:

doctrine:
    dbal:
        default_connection: a
        connections:
            a:
                driver:   '%database_a_driver%'
                url: '%env(DATABASE_A_URL)%'
                charset:  UTF8
                server_version: '%server_version%'
            b:
                driver:   '%database_b_driver%'
                url: '%env(DATABASE_B_URL)%'
                charset:  UTF8
                server_version: '%server_version%'
            c:
                driver:   '%database_c_driver%'
                url: '%env(DATABASE_C_URL)%'
                charset:  UTF8
                server_version: '%server_version%'
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        default_entity_manager: em_a

        entity_managers:
            em_a:
                connection: a
                mappings:
                    AppDba:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Dba'
                        prefix: 'App\Entity'
                        alias: AppDba
            em_b:
                connection: b
                    AppDbb:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Dbb'
                        prefix: 'App\Entity'
                        alias: AppDbb
            em_c:
                connection: c
                    AppDbc:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Dbc'
                        prefix: 'App\Entity'
                        alias: AppDbc

Теперь возникает проблема.

Когда я запускаю эту команду:

bin / console doctrine: database: create --connection = a

Соответствующая база данных создается с правильным именем и значением по умолчаниюпубличная схема, которая является пустой, также создается.Это нормально, потому что я еще не выполнил команду doctrine:schema:create --em=em_a.

Но есть также схема с несколькими таблицами внутри, которые также создаются.И эта схема не принадлежит базе данных a , а принадлежит базе данных b .И странно то, что эти таблицы внутри этой неожиданной схемы не настроены ни в одном отображении в моем приложении.Они есть только в существующей базе данных.

Кто-нибудь знает происхождение этой проблемы и как ее решить?

Дополнительная информация:

  • Symfony 3.3.18
  • PostgreSQL 9.4.17
  • доктрина 2.5.9-стабильная
  • доктрина dbal v2.6.3
  • комплект доктрины 1.9.1

1 Ответ

0 голосов
/ 20 сентября 2018

Так что благодаря DonCallisto и iiirxs я исправил проблему.Я поставил правильный префикс, а также использую установочный ключ url для подключения dbal.Я не знаю, было ли это полезно для моей проблемы.

Итак, вот конфигурация:

doctrine:
dbal:
    default_connection: a
    connections:
        a:
            driver:   '%database_a_driver%'
            url: '%env(DATABASE_A_URL)%'
            charset:  UTF8
            server_version: '%server_version%'
        b:
            driver:   '%database_b_driver%'
            url: '%env(DATABASE_B_URL)%'
            charset:  UTF8
            server_version: '%server_version%'
        c:
            driver:   '%database_c_driver%'
            url: '%env(DATABASE_C_URL)%'
            charset:  UTF8
            server_version: '%server_version%'
orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    default_entity_manager: em_a

    entity_managers:
        em_a:
            connection: a
            mappings:
                AppDba:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/Dba'
                    prefix: 'App\Entity\Dba'
                    alias: AppDba
        em_b:
            connection: b
                AppDbb:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/Dbb'
                    prefix: 'App\Entity\Dbb'
                    alias: AppDbb
        em_c:
            connection: c
                AppDbc:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/Dbc'
                    prefix: 'App\Entity\Dbc'
                    alias: AppDbc

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

И последнее: при использовании bin/console doctrine:database:create --env=test --connection=a ожидаемый результат - создание базы данных без каких-либо схем истолы.И затем при запуске bin/console doctrine:create:schema --em=em_a --env=test он должен создать все схемы и таблицы из вашего сопоставления и вашей конфигурации.

Но база данных Postgres всегда должна иметь по умолчанию public .Таким образом, при создании базы данных с доктриной, эта схема будет создана.Он будет пустым без какой-либо таблицы, но он будет там.Я предполагаю, что это специфическое поведение, связанное с драйвером postgres.Поэтому, прежде чем использовать doctrine для создания схемы и таблиц, необходимо вручную удалить эту публичную схему, в противном случае она вызовет эту ошибку:

Schema-Tool завершился с ошибкой«Возникла исключительная ситуация при выполнении« CREATE SCHEMA public »:
SQLSTATE [42P06]: Дублирующаяся схема: 7 ОШИБКА: схема« public »уже существует» при выполнении DDL: CREATE SCHEMA public

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

...