首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过Sequelize CLI将主键类型设置为UUID

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

Stack Overflow用户
提问于 2016-11-22 13:17:52
回答 12查看 44.4K关注 0票数 27

我使用以下命令通过Sequelize CLI创建一个DB模型:

代码语言:javascript
运行
复制
sequelize model:create --name User --attributes "firstname:string, lastname:string"

这将创建相应的迁移脚本:

代码语言:javascript
运行
复制
'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      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');
  }
};

如图所示,主键设置为integer

有没有办法默认命令行界面改用UUID

EN

回答 12

Stack Overflow用户

发布于 2019-11-16 04:39:51

您可以简单地使用Sequelize附带的UUIDV4类型。以下是更多详细信息:UUIDV4

例如,做出这样的定义:

代码语言:javascript
运行
复制
id: {
  type: Sequelize.UUID,
  defaultValue: Sequelize.UUIDV4,
  allowNull: false,
  primaryKey: true
}

这不是使用序列化的命令行界面,但您可以通过手动更改来使用该原生UUIDV4。

票数 28
EN

Stack Overflow用户

发布于 2017-07-16 19:32:30

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

npm install uuid

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

代码语言:javascript
运行
复制
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');
  }
};

按如下方式更新您的beforeCreate挂钩:

代码语言:javascript
运行
复制
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。

票数 23
EN

Stack Overflow用户

发布于 2018-08-30 20:49:08

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

所以..。您必须:

在您的迁移文件中,删除uuid并将id的类型从type: Sequelize.UUID

  • Install npm i uuid --save

  • In
  1. autoIncrement: true,更改为type: Sequelize.INTEGER,更改beforeCreate函数以在将其插入数据库之前生成新的uuid,如下所示:

const uuid = require('uuid/v4');/*...*/ module.exports = (sequelize,DataTypes) => { const User = sequelize.define(' User ',{ /* Your User Model Here */ },{});User.beforeCreate((user,_) => {/* user.id = uuid();});return User;};通过执行以下操作,

  • 应用迁移的更改:sequelize db:migrate:undo,然后单击sequelize db:migrate

  • Test it。
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40734263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档