Sequelize cli 如何通过Sequelize CLI将主键类型设置为UUID
我正在通过以下命令创建DB模型: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 }, 名字:{ 类型:
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(
{
身份证:{