Обработка нескольких баз данных с помощью Symfony и Doctrine - PullRequest
0 голосов
/ 17 января 2019

В настоящее время у меня есть следующий макет в базе данных:

  • legacy_db
  • legacy_out
  • применение

Мы работаем над новой концепцией, в которой мы добавляем микро-сервис для обработки всего, что поступает в нашу устаревшую БД, и сервис, который обрабатывает исходящий поток. Сами приложения работают хорошо.

Единственная реальная проблема, с которой я сейчас сталкиваюсь, - это доктрина и доктрина миграции.

Каждый раз, когда мы запускаем diff, у нас также есть все устаревшие записи в db, и мы должны удалить их.

Мы хотели бы сохранить перенос доктрин, поскольку они достаточно хорошо интегрируются с файлами миграции классов в нашу концепцию. Legacy DB не следует обновлять ни при каких обстоятельствах, но они постоянно вставляются в эти файлы. Мы запускаем diff с помощью следующей команды:

. / Bin / console доктрина: миграции: diff --em = application

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

файл конфигурации:

parameters:
  # Adds a fallback DATABASE_URL if the env var is not set.
  # This allows you to run cache:warmup even if your
  # environment variables are not available yet.
  # You should not need to change this value.
  env(DATABASE_APPLICATIONURL): ''
  env(DATABASE_LEGACY_DB_URL): ''
  env(DATABASE_LEGACY_LOG_URL): ''
  env(DATABASE_LEGACY_OUT_URL): ''

doctrine:
  dbal:
    default_connection: application
    connections:
      application:
        url: '%env(DATABASE_APPLICATIONURL)%'
        server_version: '5.7'
        charset: '%env(DATABASE_APPLICATIONCHARSET)%'
        default_table_options:
          charset: '%env(DATABASE_APPLICATIONCHARSET)%'
          collate: '%env(DATABASE_APPLICATIONCOLLATE)%'
      legacydb:
        url: '%env(DATABASE_LEGACY_DB_URL)%'
        server_version: '5.7'
        charset: '%env(DATABASE_LEGACY_DB_CHARSET)%'
        default_table_options:
          charset: '%env(DATABASE_LEGACY_DB_CHARSET)%'
          collate: '%env(DATABASE_LEGACY_DB_COLLATE)%'
      legacylog:
        url: '%env(DATABASE_LEGACY_LOG_URL)%'
        server_version: '5.7'
        charset: '%env(DATABASE_LEGACY_LOG_CHARSET)%'
        default_table_options:
          charset: '%env(DATABASE_LEGACY_LOG_CHARSET)%'
          collate: '%env(DATABASE_LEGACY_LOG_COLLATE)%'
      legacyout:
        url: '%env(DATABASE_LEGACY_OUT_URL)%'
        server_version: '5.7'
        charset: '%env(DATABASE_LEGACY_OUT_CHARSET)%'
        default_table_options:
          charset: '%env(DATABASE_LEGACY_OUT_CHARSET)%'
          collate: '%env(DATABASE_LEGACY_OUT_COLLATE)%'
  orm:
    default_entity_manager: application
    auto_generate_proxy_classes: '%kernel.debug%'
    entity_managers:
      application:
        connection: application
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        mappings:
          Application:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/vendor/COMPANY/entitybundle/src/Entity/Application'
            prefix: 'Application\Entity\Entity\Application'
            alias: App
          gedmo_translatable:
            type: annotation
            prefix: Gedmo\Translatable\Entity
            dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
            alias: GedmoTranslatable # (optional) it will default to the name set for the mapping
            is_bundle: false
          gedmo_sortable:
            type: annotation
            prefix: Gedmo\Sortable\Entity
            dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Sortable/Entity"
            alias: GedmoTree
            is_bundle: false
          gedmo_loggable:
            type: annotation
            prefix: Gedmo\Loggable\Entity
            dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity"
            alias: GedmoLoggable # (optional) it will default to the name set for the mappingmapping
            is_bundle: false
          gedmo_tree:
            type: annotation
            prefix: Gedmo\Tree\Entity
            dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity"
            alias: GedmoTree # (optional) it will default to the name set for the mapping
            is_bundle: false
        filters:
          softdeleteable:
            class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
            enabled: true
      legacydb:
        connection: legacydb
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: false
        mappings:
          InDB:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/vendor/COMPANY/entitybundle/src/Entity/LegacyDb'
            prefix: 'Application\Entity\LegacyDb'
            alias: legacydb
      legacylog:
        connection: legacylog
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: false
        mappings:
          LogDB:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/vendor/COMPANY/entitybundle/src/Entity/LegacyLog'
            prefix: 'Application\Entity\LegacyLog'
            alias: legacylog
      legacyout:
        connection: legacyout
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: false
        mappings:
          CacheDB:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/vendor/COMPANY/entitybundle/src/Entity/LegacyOut'
            prefix: 'Application\Entity\LegacyOut'
            alias: legacyout

важно держать их разделенными, так как устаревшие таблицы будут удалены рано или поздно, но их нельзя удалить, и приложение должно обрабатывать их в тот момент, пока устаревшая система не будет удалена.

Как я могу сказать, что миграции доктрин игнорируют все сущности в менеджере сущностей?

...