gpt4 book ai didi

php - 如何使用 Symfony 中的另一个连接执行 Doctrine 迁移? (使用 DoctrineMigrationsBundle 3.0.x)

转载 作者:行者123 更新时间:2023-12-04 12:32:11 25 4
gpt4 key购买 nike

我使用 DoctrineBundle 和 DoctrineMigrationsBundle 开发了一个 Symfony 应用程序。 Doctrine 和Symfony依赖的版本如下:composer.json

{
"type": "project",
"license": "proprietary",
"require": {
"php": ">=7.2.5",
...
"doctrine/annotations": "^1.0",
"doctrine/doctrine-bundle": "^2.1",
"doctrine/doctrine-migrations-bundle": "^3.0",
"doctrine/orm": "^2.7",
...
"symfony/framework-bundle": "5.1.*",
...
},
...
}

出于安全原因,我想使用两个不同的数据库连接, default一个数据库用户对应用程序使用的表具有 SELECT、INSERT、UPDATE、DELETE 权限 - 基本上,所有数据权限,它是“应用程序用户” - 另一个, migrations , 具有对结构具有权限的数据库用户:在表上创建、更改、删​​除...。
两个连接都在配置中定义: config/packages/doctrine.yaml :
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_pgsql'
server_version: '11.1'
charset: UTF8
migrations:
url: '%env(resolve:DATABASE_MIGRATIONS_URL)%'
driver: 'pdo_pgsql'
server_version: '11.1'
charset: UTF8
对于以前版本的捆绑包,在 Symfony 4.4 应用程序中,有一个 --db doctrine:migration:migrate 的选项命令,它允许选择用于执行迁移的连接:
php bin/console doctrine:migrations:migrate --db=migrations --no-interaction
但是,在捆绑包的 3.0.x 版本中,此选项已消失。只有 --configuration--db-configuration似乎可以实现相同目标的选项,但我不知道如何使其工作。
我试过的:
  • doctrine.yaml 中添加了第二个实体管理器, 使用 migrations连接(没有映射 - 我只想用它来执行迁移,这是 SQL 命令):
  • doctrine.yaml :
    doctrine:
    dbal:
    default_connection: default
    connections:
    default:
    url: '%env(resolve:DATABASE_URL)%'
    driver: 'pdo_pgsql'
    charset: UTF8
    # Used to execute database migrations - conection with the owner user
    migrations:
    url: '%env(resolve:DATABASE_MIGRATIONS_URL)%'
    driver: 'pdo_pgsql'
    charset: UTF8

    orm:
    auto_generate_proxy_classes: true

    default_entity_manager: default
    entity_managers:
    default:
    connection: default
    naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
    auto_mapping: true
    # Used to create and execute database migrations
    migrations:
    connection: migrations
  • 我保持默认 config/packages/doctrine_migrations.yaml ,它使用默认的实体管理器,并添加了第二个文件:
  • doctrine_migrations_db_owner.yaml
    doctrine_migrations:
    migrations_paths:
    'DoctrineMigrations': '%kernel.project_dir%/migrations'
    em: migrations
  • 使用此文件启动迁移:
  • php bin/console doctrine:migrations:migrate --configuration=./config/packages/doctrine_migrations_db_owner.yaml
    但是,我有关于 doctrine_migrations 的错误在 yaml 文件中键入...我试图删除它,但是 migrations_paths 上又出现了另一个错误...
    有没有人可以提供有关如何使用此选项或其他解决方案来实现我想要的功能的提示?

    最佳答案

    我最后给出了一个解决方案,在我看来,它比我在之前版本的 Doctrine migrations Bundle 中所做的更清晰。
    在应用程序中,我仅使用默认数据库 url(定义为环境变量,或在 .env 中):

    # config/packages/doctrine.yaml
    doctrine:
    dbal:
    url: '%env(resolve:DATABASE_URL)%'
    driver: 'pdo_pgsql'
    charset: UTF8
    # config/packages/doctrine_migrations.yaml
    doctrine_migrations:
    migrations_paths:
    # namespace is arbitrary but should be different from App\Migrations
    # as migrations classes should NOT be autoloaded
    'DoctrineMigrations': '%kernel.project_dir%/migrations'
    并且,当我想使用在 DATABASE_MIGRATIONS_URL 中定义的特权数据库用户执行迁移时变量,我直接在命令中将它作为 env var 传递:
    DATABASE_URL="$DATABASE_MIGRATIONS_URL" php bin/console doctrine:migrations:migrate
    变量定义如下:
    DATABASE_MIGRATIONS_URL="postgresql://$DB_OWNER:$DB_OWNER_PASS@$DB_HOST:5432/$DB_NAME?serverVersion=$PG_VERSION

    关于php - 如何使用 Symfony 中的另一个连接执行 Doctrine 迁移? (使用 DoctrineMigrationsBundle 3.0.x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64699325/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com