我最近将我的 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
项目详情:
问题: 首先,为什么 Doctrine 会生成这个
ALTER TABLE
语句,以及为什么 Doctrine 在执行后不断生成相同的 ALTER TABLE
语句?
nullable: true
和 options: ['default' => 0]
的组合可能会导致不一致。数据库模式可以对 NULL 值和默认值 0 进行不同的解释。
解决方案: 调整
myColumn
定义以消除歧义,重新应用迁移,看看会发生什么
#[ORM\Column(type: 'float', nullable: false, options: ['default' => 0])]
private float $myColumn = 0;