Sequelize cli 如何通过Sequelize CLI将主键类型设置为UUID

Sequelize cli 如何通过Sequelize CLI将主键类型设置为UUID,sequelize-cli,Sequelize Cli,我正在通过以下命令创建DB模型: sequelize模型:创建--name用户--attributes“firstname:string,lastname:string” 这将创建相应的迁移脚本: “严格使用”; module.exports={ up:函数(查询接口、续集){ 返回queryInterface.createTable('用户'{ 身份证:{ allowNull:错, 自动递增:真, primaryKey:没错, 类型:Sequelize.INTEGER }, 名字:{ 类型:

我正在通过以下命令创建DB模型:

sequelize模型:创建--name用户--attributes“firstname:string,lastname:string”
这将创建相应的迁移脚本:

“严格使用”;
module.exports={
up:函数(查询接口、续集){
返回queryInterface.createTable('用户'{
身份证:{
allowNull:错,
自动递增:真,
primaryKey:没错,
类型:Sequelize.INTEGER
},
名字:{
类型:Sequelize.STRING
},
姓氏:{
类型:Sequelize.STRING
},
创建数据:{
allowNull:错,
类型:Sequelize.DATE
},
更新日期:{
allowNull:错,
类型:Sequelize.DATE
}
});
},
向下:函数(查询接口、续集){
返回queryInterface.dropTable(“用户”);
}
};
如图所示,主键设置为
integer


是否有办法将CLI默认为使用
UUID

您必须手动编辑生成的文件,将
Sequelize.INTEGER
更改为
Sequelize.UUID
,然后删除
autoIncrement:true

npm安装uuid

因此,您的模型将如下所示:

const uuid = require('uuid/v4'); // ES5

'use strict';

module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.UUID
      },
      /* Other model properties */
    });
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.dropTable('Users');
  }
};
const uuid = require('uuid/v4');
/*...*/
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    /* Your User Model Here */
  }, {});
  User.beforeCreate((user, _ ) => {
    return user.id = uuid();
  });
  return User;
};
在创建挂钩之前更新您的
,如下所示:

const uuid = require('uuid/v4');

export default (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: {
      allowNull: false,
      primaryKey: true,
      type: Sequelize.UUID
    },
    ...
  }, {});

  User.beforeCreate(user => user.id = uuid());

  return User;
};
这假设您使用的是Sequelize v4


最后一个答案不起作用,因为
uuid()
函数将为数据库中的所有用户设置唯一的默认值。由于它们是一个primaryKey,您将能够在数据库中只持久化一个用户,然后每个人都将收到相同的uuid值,当然,不会持久化

所以。。。你必须:

  • 在迁移文件中,删除
    autoIncrement:true,
    并将id的类型从
    type:Sequelize.INTEGER
    更改为
    type:Sequelize.UUID
  • npm i uuid--save安装uuid生成器功能
  • 在生成的用户模型中,更改
    beforeCreate
    函数以在将新uuid插入数据库之前生成新uuid,如下所示:

    const uuid = require('uuid/v4'); // ES5
    
    'use strict';
    
    module.exports = {
      up: function(queryInterface, Sequelize) {
        return queryInterface.createTable('Users', {
          id: {
            allowNull: false,
            primaryKey: true,
            type: Sequelize.UUID
          },
          /* Other model properties */
        });
      },
      down: function(queryInterface, Sequelize) {
        return queryInterface.dropTable('Users');
      }
    };
    
    const uuid = require('uuid/v4');
    /*...*/
    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define('User', {
        /* Your User Model Here */
      }, {});
      User.beforeCreate((user, _ ) => {
        return user.id = uuid();
      });
      return User;
    };
    
  • 通过执行以下操作应用迁移的更改:
    sequelize db:migrate:undo
    然后执行
    sequelize db:migrate

  • 测试一下


  • 您可以使用此脚本修改迁移脚本

    'use strict';
    module.exports = {
      up: function(queryInterface, Sequelize) {
        return queryInterface.createTable('Users', {
          id: {
            primaryKey: true,
            type: Sequelize.UUID,
            defaultValue: Sequelize.literal('uuid_generate_v4()')
          },
          firstname: {
            type: Sequelize.STRING
          },
          lastname: {
            type: Sequelize.STRING
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      down: function(queryInterface, Sequelize) {
        return queryInterface.dropTable('Users');
      }
    };
    

    它适合我。

    您可以简单地使用Sequelize附带的UUIDV4类型。 详情如下:

    例如,作出这一定义:

    id: {
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
      allowNull: false,
      primaryKey: true
    }
    
    这不是使用Sequelize CLI,但是您可以通过手动更改该本地UUIDV4来使用该本地UUIDV4

    id: {
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
      allowNull: false,
      primaryKey: true
    }
    
    这是真的;但是,有一个bug我还没有足够的经验来解释:如果您的模型在使用sequelize提供的示例时包含该格式,那么它将不起作用。即使如此,您也不需要在sequelize之外导入UUID;您仍然可以利用sequelize提供的功能,但出于以下原因,您必须在中要求它:

    "use strict";
    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define(
        "User",
        {
          id: {
            primaryKey: true,
            type: DataTypes.UUID,
            defaultValue: require("sequelize").UUIDV4
          },
        {}
      );
      User.associate = function(models) {
        //enter associations here
        });
      };
      return User;
    };`
    
    我对此进行了测试,并取得了成功,但我之所以发现这一点,是因为我之前取得了成功,我的模型设置是这样的,在定义模型之前,我需要一切:

    const { Sequelize, DataTypes, Model } = require("sequelize");
    const db = require("../../config/database");
    
    const userModel = db.define("users", {
      id: {
        type: DataTypes.UUID,
        defaultValue: Sequelize.UUIDV4,
        primaryKey: true
      }
    });
    

    如果需要让Postgres在insert上生成UUID作为默认值, 这种方法
    defaultValue:Sequelize.UUIDV4
    不起作用。无论如何,Sequelize生成空值

    相反,必须使用
    Sequelize.literal('uuid\u generate\u v4()')
    。 如果不存在“表”(“id”UUID NOT NULL默认UUID_generate_v4())
    ,则应生成查询
    创建表


    上面提到的任何解决方案对我都不起作用。但这对我自己解决问题很有帮助

    我使用ES6+语法,并通过以下方式解决:

    PS:v5.x上的续集

    迁移

    “严格使用”;
    module.exports={
    up:(查询接口,续集)=>{
    返回queryInterface.createTable('用户'{
    身份证:{
    类型:Sequelize.UUID,
    primaryKey:没错,
    allowNull:错,
    defaultValue:Sequelize.UUIDV4,
    },
    姓名:{
    类型:Sequelize.STRING,
    allowNull:错,
    },
    创建于:{
    类型:Sequelize.DATE,
    allowNull:错,
    },
    更新地址:{
    类型:Sequelize.DATE,
    allowNull:错,
    }
    });
    },
    向下:(查询接口)=>{
    返回queryInterface.dropTable(“用户”);
    }
    }
    
    型号

    从'uuidv4'导入{uuid};
    从“Sequelize”导入Sequelize,{Model};
    类用户扩展模型{
    静态初始化(sequelize){
    super.init(
    {
    名称:Sequelize.STRING,
    },
    {
    续集,
    }
    );
    this.addHook('beforeSave',async(user)=>{
    返回user.id=uuid();
    });
    归还这个;
    }
    }
    导出默认用户;
    
    控制器

    从“../models/User”导入用户;
    类用户控制器{
    异步存储(请求、响应){
    const{user}=request.body;
    const{id,name}=wait User.create(users);
    return response.json({
    身份证件
    消息:`User${name}已成功注册`,
    });
    }
    
    简单,适用于所有数据库

     const uuidv4 = require('uuid/v4');
    
       id: {
          type: DataTypes.UUID,
          unique: true,
          primaryKey: true,
          isUUID: 4,
          defaultValue: uuidv4()
        },
    

    确保package.json已更新uuid模块

    "uuid": "^8.2.0",
    
    这就是我的问题所在,因为以前是
    3.4.0
    ,sequelize不适用于此

    accessSecret: {
          type: DataTypes.UUID,
          defaultValue: Sequelize.UUIDV4,
          allowNull: false,
          unique: true,
        },
    
    在MySQL上升级uuid包之后,这种方法就可以正常工作了

    别忘了将导入更改为

    const{v4:uuid}=require('uuid')


    在“sequelize”上测试:“^5.21.13”

    我尝试了许多选项,结果都很简单。像这样试试

    型号:
    从“sequelize”导入{Model,DataTypes};
    从“uuid”导入{v4作为uuidv4};
    从“..”导入sequelize;
    类用户扩展模型{}
    User.init(
    {
    身份证:{