33

我正在使用以下命令通过Sequelize CLI创建数据库模型:

sequelize model:create --name User --attributes "firstname:string, lastname:string"

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

'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

有没有办法默认使用 CLI UUID

4

12 回答 12

34

您可以简单地使用 Sequelize 附带的 UUIDV4 类型。这里有更多细节: UUIDV4

例如做出这个定义:

id: {
  type: Sequelize.UUID,
  defaultValue: Sequelize.UUIDV4,
  allowNull: false,
  primaryKey: true
}

这不是使用 Sequelize CLI,但您可以通过手动更改来使用本机 UUIDV4。

于 2019-11-15T20:39:51.230 回答
23

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

npm install 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');
  }
};

beforeCreate如下更新你的钩子:

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。

于 2017-07-16T11:32:30.047 回答
15

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

所以......你必须:

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

    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;
    };
    
  4. sequelize db:migrate:undo通过执行以下操作应用迁移的更改:sequelize db:migrate

  5. 测试一下。

于 2018-08-30T12:49:07.843 回答
11

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

'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');
  }
};

这个对我有用。

于 2018-09-27T09:44:46.047 回答
5

上面提到的任何解决方案都不适合我。但是对我自己解决问题很有帮助。

我正在使用 ES6+ 语法并以这种方式解决:

PS:在 v5.x 上续集

移民

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('users', {
      id: {
        type: Sequelize.UUID,
        primaryKey: true,
        allowNull: false,
        defaultValue: Sequelize.UUIDV4,
      },
      name: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      updated_at: {
        type: Sequelize.DATE,
        allowNull: false,
      }
    });
  },

  down: (queryInterface) => {
    return queryInterface.dropTable('users');
  }
}

模型

import { uuid } from 'uuidv4';
import Sequelize, { Model } from 'sequelize';

class User extends Model {
  static init(sequelize) {
    super.init(
      {
        name: Sequelize.STRING,
      },
      {
        sequelize,
      }
    );

    this.addHook('beforeSave', async (user) => {
      return user.id = uuid();
    });

    return this;
  }
}

export default Users;

控制器

import User from '../models/User';

class UserController {
  async store(request, response) {
    const { user } = request.body;

    const { id, name } = await User.create(users);

    return response.json({
      id,
      message: `User ${name} was register successful`,
    });
  }
于 2020-05-08T21:03:31.370 回答
4
  • 没有自动增量。UUID 是随机生成的。
  • 确保您使用DataType.UUID和默认值UUIDV4

没有自动增量。生成 UUID

export const User = db.define('user',
    {
        id: {
            type: DataTypes.UUID,
            defaultValue: DataTypes.UUIDV4,
            primaryKey: true,
        },
于 2021-06-01T14:30:55.277 回答
4

如果您需要让 Postgres 在插入时生成 UUID 作为默认值,这种方法defaultValue: Sequelize.UUIDV4将不起作用。无论如何,Sequelize 会生成 NULL 值。

相反,Sequelize.literal('uuid_generate_v4()')必须使用。那将产生 query CREATE TABLE IF NOT EXISTS "table" ("id" UUID NOT NULL DEFAULT uuid_generate_v4())

id: {
    allowNull: false,
    primaryKey: true,
    type: Sequelize.DataTypes.UUID,

    defaultValue: Sequelize.literal('uuid_generate_v4()'),
},
于 2020-04-20T12:24:31.733 回答
3

我尝试了很多选择,结果一切都很简单。像这样试试

模型:

import { Model, DataTypes } from 'sequelize';
import { v4 as uuidv4 } from 'uuid';

import sequelize from '..';

class User extends Model {}

User.init(
  {
    id: {
      type: DataTypes.UUID,
      primaryKey: true,
      allowNull: false,
      defaultValue: () => uuidv4(),
    }
  },
  {
    sequelize,
    tableName: 'user',
    timestamps: false,
  },
);

export default User;

移民:

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

module.exports = {
  up: async (queryInterface, DataTypes) => {
    await queryInterface.createTable('user', {
      id: {
        type: DataTypes.UUID,
        primaryKey: true,
        allowNull: false,
        defaultValue: uuidv4(),
      }
    });
  },

  down: async queryInterface => {
    await queryInterface.dropTable('user');
  },
};

于 2021-02-24T13:15:23.060 回答
2
id: {
  type: Sequelize.UUID,
  defaultValue: Sequelize.UUIDV4,
  allowNull: false,
  primaryKey: true
}

@Ismael Terreno的回答是正确的;但是,有一个我没有足够经验来解释的错误:如果您的模型在使用 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
  }
});
于 2020-02-26T18:09:02.570 回答
2

确保您的 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"

于 2020-07-20T11:51:05.397 回答
1

对于v6.5.0使用 Postgres 指定的续集defaultValue: Sequelize.UUIDV4不起作用。相反,我不得不这样做:

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {

      await queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";')
      await queryInterface.addColumn('MyTable', 'id', {
        type: Sequelize.UUID,
        defaultValue: Sequelize.literal('uuid_generate_v4()'),
        allowNull: false,
        primaryKey: true
      })

  },
  down: async (queryInterface, Sequelize) => {

  }
};
于 2021-08-09T18:44:23.337 回答
1

简单并适用于所有数据库

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

   id: {
      type: DataTypes.UUID,
      unique: true,
      primaryKey: true,
      isUUID: 4,
      defaultValue: uuidv4()
    },
于 2020-06-26T12:15:59.050 回答