You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:15:08