一个数据库中的多个 Symfony 项目,但不同的 Postgres 模式
Several Symfony projects in one database but different Postgres schemas
我正在尝试设置多个 Symfony REST API 项目(实际上是微服务)位于单个 Postgres 数据库中但在数据库中占用不同模式的环境。
使用@ORM\Table
定义模式没有问题,但我发现migration_versions
table仍然存在于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
我正在尝试设置多个 Symfony REST API 项目(实际上是微服务)位于单个 Postgres 数据库中但在数据库中占用不同模式的环境。
使用@ORM\Table
定义模式没有问题,但我发现migration_versions
table仍然存在于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