如何在已通过node ace创建模型与迁移后为用户表新增列?
AdonisJS 已创建User模型与对应迁移文件时,新增数据库列的操作流程
核心原则:不要直接修改已生成、已执行过的旧初始user迁移文件,所有列变更都通过新增独立迁移实现
具体操作步骤
- 生成专属的列变更迁移文件,在项目根目录执行命令:
node ace make:migration add_columns_to_users_table
命令里的迁移描述部分可以根据实际要加的列调整,只要表意清晰即可,Adonis会自动带时间戳前缀,把新迁移文件放到项目的database/migrations目录下。 - 编辑新生成的迁移文件,在
up方法里定义要新增的列规则,在down方法里写好对应的回滚逻辑:
注意:给已有数据的表加列时,涉及非空约束的列必须配置默认值或者设置为nullable,否则会因为存量行没有对应列值,导致迁移执行直接报错。import BaseSchema from '@ioc:Adonis/Lucid/Schema' export default class extends BaseSchema { protected tableName = 'users' public async up () { this.schema.table(this.tableName, (table) => { // 替换成你要新增的列定义,比如加个手机号列 table.string('phone').unique().nullable() }) } public async down () { this.schema.table(this.tableName, (table) => { // 写清楚回滚时要删掉的列,避免迁移出错无法回退 table.dropColumn('phone') }) } } - 同步更新User模型的配置:
- 如果项目给User模型配置了
fillable白名单,需要把新增的列名加到白名单数组里,不然批量赋值时会拦截对应字段 - 如果是TS类型的项目,需要在User模型的类型定义里补充新增列的字段类型,避免出现TS类型校验报错
- 如果项目给User模型配置了
- 执行迁移命令,把列变更同步到数据库,运行:
node ace migration:run
踩坑提醒
不要回头去修改最开始创建的那个初始user迁移文件的schema定义:只要这个迁移文件已经被本地或者线上数据库执行过,后续系统就不会再触发这个文件的执行逻辑,就算改了内容也不会对现有数据库生效,还会打乱团队的迁移历史一致性。
内容的提问来源于stack exchange,提问作者Angelin
相关产品推荐
相关产品推荐

