php 使用symfony4和doctrine设置多个数据库时,如何修复在两个数据库上运行的迁移

jdgnovmf  于 2022-11-28  发布在  PHP
关注(0)|答案(2)|浏览(92)

我正在尝试为symfony 4.2项目设置第二个数据库。在运行迁移之前,一切似乎都运行得很好,所有的迁移都在给定的连接上执行,而不仅仅是为创建的连接执行迁移。
下面symfony's own documentation关于这个,我的教义。yaml看起来像这样:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                url: '%env(DATABASE_URL)%'
            logging:
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
                url: '%env(DATABASE_URL_LOG)%'
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: App
            logging:
                connection: logging
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: false
                mappings:
                    Log:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Log'
                        prefix: 'App\Log'
                        alias: Log

现在,通过此配置,我可以使用--em=log/default参数运行迁移命令,如下所示:

php bin/console doctrine:migrations:diff --em=log
php bin/console doctrine:migrations:migrate --em=log

你会得到预期的结果:当我添加--em=log时,它只会为我在src/Log中创建的新实体创建一个新的迁移。
这是新的实体:

<?php

namespace App\Log;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class LogItem
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;
}

但是,迁移是在默认的src/Migrations文件夹中创建的,因此:
1)当我运行doctrine:migrations:migrate --em=default(在默认数据库中创建表)时,也会执行此迁移
2)当我运行doctrine:migrations:migrate --em=log时,整个默认架构被加载到日志数据库中
所以我认为解决方案是将实体管理器之间的迁移文件分割到不同的目录中。但是我已经花了几个小时,找不到为symfony 4做这件事的方法。而且,由于symfony文档完全没有提到这件事,我觉得可能是它现在的设置方式出了问题。
那么,谁能告诉我我在这里做错了什么?或者谁能告诉我(如果是的话:如何)分割迁移文件,以便只执行为给定实体管理器创建的迁移?

icnyk63a

icnyk63a1#

doctrine/doctrine-migrations-bundle不支持对多个实体管理器进行现成的迁移。此问题有多种解决方法,包括:

  • 容器感知迁移(仅在Symfony〈4上可行)
  • 分别存储每个实体管理器的迁移配置,并通过doctrine:migrations:migrate命令的--configuration选项直接传递它(仅当您不需要将服务/依赖关系注入到迁移中时才可行)
  • 使用avaibooksports/doctrine-migrations-multiple-database-bundle(或滚动您自己的bundle),它实现了对每个实体管理器的单独配置的支持(在其中,您可以为每个实体的迁移指定单独的目录,并根据需要通过工厂注入服务)。

有一个开放的GitHub issue(开放于2012年)更详细地描述了这些方法。

pobjuy32

pobjuy322#

我想你的样品里有个打字错误。
doctrine.yaml文件中,实体管理器的名称为“default”和“logging”。
但是在命令行示例中,您使用了实体管理器名称“log”。当您将标志从--em=log更改为--em=logging时,它应该可以工作。

相关问题