一个数据库中的多个 Symfony 项目,但不同的 Postgres 模式

Several Symfony projects in one database but different Postgres schemas

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

使用@ORM\Table定义模式没有问题,但我发现migration_versionstable仍然存在于public模式中。在第二个项目中应用迁移时盲目点击 'Yes' 只会删除第一个项目的 table。

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

根据 symfony 文档,您可以为每个项目命名迁移 table,也许使用与分隔 table 相同的前缀。

 # 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

假设您的项目 table 以 myproject_ 前缀开头。为了防止迁移删除你的其他 tables,你可以在你的 config.yml/doctrine.yml 中使用 doctrine dbal schema_filter 属性

config.yml

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

根据 symfony 文档:# 如果设置为“/^sf2_/”,架构工具将忽略所有未以“sf2_”为前缀的 table。这是针对不应自动更改的自定义 table。

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

对于 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-migration-bundle 它看起来像

doctrine_migrations:
    storage:
        table_storage:
            table_name: your_table_name

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