【问题标题】:Several Symfony projects in one database but different Postgres schemas一个数据库中有多个 Symfony 项目,但 Postgres 模式不同
【发布时间】:2019-07-16 14:45:20
【问题描述】:

我正在尝试设置多个 Symfony REST API 项目(实际上是微服务)存在于单个 Postgres 数据库中但在数据库中占用不同模式的环境。

使用@ORM\Table 定义架构没有问题,但我发现migration_versions 表仍然存在于public 架构中。在第二个项目中应用迁移时盲目地点击“是”只会删除第一个项目的表。

当然,我可以手动修剪生成的迁移类不允许执行DROP TABLE 语句。但是是否可以将 Doctrine 设置为使用自定义模式来存储 migration_versions 表,从而在单个数据库中将一个项目与其他项目完全隔离?

【问题讨论】:

标签: postgresql symfony doctrine-orm


【解决方案1】:

根据 symfony 文档,您可以在每个项目中命名迁移表,可能使用您用来分隔表的相同前缀。

 # config/packages/doctrine_migrations.yaml
doctrine_migrations:
    dir_name: '%kernel.project_dir%/src/Migrations'
    namespace: DoctrineMigrations
    table_name: 'migration_versions' // Use a custom name for each application ? 
    column_name: 'version'
    column_length: 14
    executed_at_column_name: 'executed_at'
    name: 'Application Migrations'
    # available in version >= 1.2. Possible values: "BY_YEAR", "BY_YEAR_AND_MONTH", false
    organize_migrations: false
    # available in version >= 1.3. Path to your custom migrations template
    custom_template: ~
    all_or_nothing: false

https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.html

假设您的项目表以 myproject_ 前缀开头。为了防止迁移删除您的其他表,您可以在 config.yml/doctrine.yml

中使用教义 dbal schema_filter 属性

config.yml

doctrine:
    dbal:
        schema_filter: "/^myproject_/" 

根据 symfony 文档:# 如果设置为“/^sf2_/”,所有不以“sf2_”为前缀的表都将被模式工具忽略。这适用于不应自动更改的自定义表格。

所以这应该可以解决您的用例

【讨论】:

  • 谢谢!我将尝试在 table_name 属性中使用点符号将 migration_versions 移动到所需的架构中。再次感谢!
  • 嗯... Doctrine 为邻居项目生成 DROP TABLE 语句可能很奇怪。对于实体表和migraion_versions_<project_name>。同样,它可以手动清除。但是为什么 Doctrine 过于关心与当前项目无关的表呢?
  • 查看文档的最后一节关于教义 dbal 过滤器属性。如果您想到一个正则表达式,它可能会起作用:任何表名不以我的项目前缀开头...
  • 看起来它只在第一次运行良好,但是当我切换回第一个项目并开始向实体添加属性时,./bin/console make:migration 它无法生成它,因为 Duplicate table: 7 ERROR: relation "migration_versions_first" already exists 。 “first”是migration_versions 表的后缀和在“first”模式中创建的实体表的前缀。需要一些调试来找出真正的原因。
  • 第二个实验项目的情况相同:虽然make:migration 它想要重新创建migration_versions_<project_postfix> 表,尽管table_name 属性设置在doctrine-migrations.yaml
【解决方案2】:

对于 Doctrine Migration v3.x 注意配置已更改!

table_name: your_table_name

被替换为

table_storage:
    table_name: your_table_name

Doctrine 迁移文档在这里:https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html

如果你使用学说迁移捆绑,它看起来像

doctrine_migrations:
    storage:
        table_storage:
            table_name: your_table_name

Doctrine 迁移包文档在这里:https://symfony.com/bundles/DoctrineMigrationsBundle/current/index.html#configuration

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2011-09-07
    • 2015-06-28
    • 2012-10-20
    • 2021-06-25
    • 2010-11-25
    • 2016-08-05
    • 2014-11-01
    相关资源
    最近更新 更多