Sequelize搭配MySQL设置UUID主键报错:字段id无默认值如何解决
问题排查与解决方案
- 核心错误:迁移文件表名不匹配
你提供的迁移文件up阶段创建的是Admins表,而非你需要的Users表,down阶段删除的却是Users表,这就导致你执行迁移后,数据库中不存在结构符合预期的Users表。你操作Users模型时对应的实际表要么是旧版本创建的(id字段未设置UUID默认值),要么结构完全不对,这是触发Field 'id' doesn't have a default value报错的最主要原因。
修正方案:将迁移文件up函数中createTable的第一个参数改为'Users',修正后的迁移代码如下:
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { // 此处将Admins修改为Users await queryInterface.createTable('Users', { id: { type: Sequelize.UUID, defaultValue: Sequelize.UUIDV4, allowNull: false, primaryKey: true }, user_name: { type: Sequelize.STRING, allowNull: false }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Users'); } };
- 操作步骤错误:未重新执行迁移生效配置
如果你之前已经执行过错误的迁移,直接修改迁移文件不会自动更新数据库表结构,需要先回滚错误迁移,再重新执行新的迁移:
- 回滚上一次迁移:
npx sequelize-cli db:migrate:undo - 执行修正后的迁移:
npx sequelize-cli db:migrate
- 其他可能的问题:seed插入方式不符合预期
如果你编写的seed文件是直接执行原生SQL插入数据,没有调用Sequelize模型的create方法,需要手动为id字段生成UUID值,因为原生SQL不会触发Sequelize模型层面的默认值生成逻辑。如果是通过模型插入,你当前模型中配置的defaultValue: DataTypes.UUIDV4会自动生成合法UUID,不需要手动传id参数。
内容的提问来源于stack exchange,提问作者mochacookies
相关产品推荐
相关产品推荐

