Sequelize中MySQL数据库UUID主键不生效问题求助
嘿,我看你现在的问题应该是没把UUID真正设为主键,只是加了个普通的UUID字段对吧?我帮你一步步调整:
解决Sequelize中UUID作为主键的问题
首先看你给出的模型代码,你只定义了一个test字段为UUID类型,但默认的主键还是Sequelize自动生成的整数id。要把UUID设为主键,需要同步调整模型和迁移文件:
1. 修正模型代码
修改后的模型需要显式定义主键为UUID类型,并且配置自动生成默认值:
'use strict'; module.exports = (sequelize, DataTypes) => { var Todo = sequelize.define('Todo', { // 替换默认整数id,用UUID做主键 id: { type: DataTypes.UUID, primaryKey: true, defaultValue: DataTypes.UUIDV4, // 自动生成UUID值 allowNull: false }, title: DataTypes.STRING, description: DataTypes.STRING, // 如果不需要test字段可以直接删除,需要的话保留即可 test: DataTypes.UUID }, {}); Todo.associate = function(models) { // 关联定义保持不变 }; return Todo; };
2. 修正迁移文件
迁移文件里也要对应修改主键的类型,并且根据你使用的数据库设置默认值:
如果你用PostgreSQL:
PostgreSQL需要先启用uuid-ossp扩展才能生成UUID,迁移文件可以这么写:
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { // 先启用UUID扩展(PostgreSQL必需) await queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'); await queryInterface.createTable('Todos', { id: { allowNull: false, primaryKey: true, type: Sequelize.UUID, defaultValue: Sequelize.fn('uuid_generate_v4') }, title: { type: Sequelize.STRING }, description: { type: Sequelize.STRING }, test: { type: Sequelize.UUID }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Todos'); // 回滚时可选删除扩展 await queryInterface.sequelize.query('DROP EXTENSION IF EXISTS "uuid-ossp";'); } };
如果你用MySQL:
MySQL可以直接用内置的UUID()函数生成默认值,迁移文件调整如下:
'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.createTable('Todos', { id: { allowNull: false, primaryKey: true, type: Sequelize.UUID, defaultValue: Sequelize.fn('UUID') }, title: { type: Sequelize.STRING }, description: { type: Sequelize.STRING }, test: { type: Sequelize.UUID }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Todos'); } };
额外注意事项
- 如果之前已经运行过旧的迁移,需要先回滚(
npx sequelize-cli db:migrate:undo)再执行新迁移 - 确保你的Sequelize版本支持UUID类型(v4及以上版本都没问题)
- 若不需要
test字段,可直接从模型和迁移文件中删除
内容的提问来源于stack exchange,提问作者agims7
相关产品推荐
相关产品推荐

