Doctrine 迁移:重复生成相同的 ALTER TABLE 语句

问题描述 投票:0回答:1

我最近将我的 Symfony 项目从 5.4 升级到 6.4.13。现在,我在 Symfony 项目中遇到了 Doctrine Migrations 的问题。当我运行

doctrine:migrations:diff
命令时,它会生成一个
ALTER TABLE
语句来更改列类型和默认值。但是,应用迁移并再次运行
doctrine:migrations:diff
命令后,会重复生成相同的
ALTER TABLE
语句。

这是生成的SQL语句:

$this->addSql('ALTER TABLE my_entity CHANGE my_column my_column DOUBLE PRECISION DEFAULT 0');

实体:

#[ORM\Entity]
class MyEntity
{
    ...

    #[ORM\Column(type: 'float', nullable: true, options: ['default' => 0])]
    #[Assert\Range(min: 0)]
    private ?float $myColumn = 0;

    ...
}

迁移配置:

doctrine.yaml:

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
    orm:
        auto_generate_proxy_classes: true
        mappings:
            App:
                type: attribute
                is_bundle: false
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

doctrine_migrations.yaml:

doctrine_migrations:
    migrations_paths:
        'App\Migrations': '%kernel.project_dir%/src/Migrations'
    storage:
        table_storage:
            table_name: 'migration_versions'
            version_column_name: 'version'
            version_column_length: 192
            executed_at_column_name: 'executed_at'
    check_database_platform: true

项目详情:

  • Symfony 版本:6.4.13
  • PHP版本:8.1
  • Composer依赖项包括doctrine/doctrine-migrations-bundle v3.3.1和doctrine/doctrine-bundle v2.13.1。

问题: 首先,为什么 Doctrine 会生成这个

ALTER TABLE
语句,以及为什么 Doctrine 在执行后不断生成相同的
ALTER TABLE
语句?

php symfony doctrine-orm doctrine
1个回答
0
投票

nullable: true
options: ['default' => 0]
的组合可能会导致不一致。数据库模式可以对 NULL 值和默认值 0 进行不同的解释。

解决方案: 调整

myColumn
定义以消除歧义,重新应用迁移,看看会发生什么

#[ORM\Column(type: 'float', nullable: false, options: ['default' => 0])]
private float $myColumn = 0;
© www.soinside.com 2019 - 2024. All rights reserved.