如何在Sequelize迁移文件中让新增字段的defaultValue从已有列取值
解决方法
你的写法有两个核心问题:
defaultValue仅支持静态值、数据库原生函数,不支持传入自定义异步逻辑,你写的内部查询和批量插入逻辑完全不会被执行- 给已有数据的表加非空字段不能直接加,要先加可空字段赋值完成后再修改为非空约束
正确的迁移代码
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { // 第一步:先新增允许为空的companyCode字段 await queryInterface.addColumn('company', 'companyCode', { type: Sequelize.STRING(3), allowNull: true }); // 第二步:批量更新已有数据的companyCode为name字段前3个字符大写 // 注意:如果用SQLite,把LEFT替换为SUBSTR(name, 1, 3)即可 await queryInterface.sequelize.query( `UPDATE company SET companyCode = UPPER(LEFT(name, 3))` ); // 第三步:修改字段属性为非空 await queryInterface.changeColumn('company', 'companyCode', { type: Sequelize.STRING(3), allowNull: false }); }, down: (queryInterface) => { return queryInterface.removeColumn('company', 'companyCode'); } };
额外说明
如果存在公司名称长度不足3的情况,可以在更新语句里加判断补位,比如MySQL下可以写UPPER(RPAD(LEFT(name,3),3,'X')),不足3位的用X补齐,避免长度不符合字段约束。
内容的提问来源于stack exchange,提问作者Sahar
相关产品推荐
相关产品推荐

