在MySQL数据库中将primaryKey替换为UUID-不起作用

agi*_*ms7 6 mysql uuid node.js express sequelize.js

我在Sequalize中使用主键作为uuid面临实现模型的问题。我会按照所有说明逐步进行操作,但仍然无法解决。

这是我的模型的样子:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Todo = sequelize.define('Todo', {
    title: DataTypes.STRING,
    description: DataTypes.STRING,
    test: DataTypes.UUID
  }, {});
  Todo.associate = function(models) {
    // associations can be defined here
  };
  return Todo;
};
Run Code Online (Sandbox Code Playgroud)

和迁移文件:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Todos', {
      id: {
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV1
      },
      title: {
        type: Sequelize.STRING
      },
      description: {
        type: Sequelize.STRING
      },
      test: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Todos');
  }
};
Run Code Online (Sandbox Code Playgroud)

调用post方法创建元素后,我在ID列中有一个空值,在测试列中有NULL ...

Datebase是MySql。

还有其他方法吗?

vap*_*aid 7

1)在Sequelize中设置自定义键

我在Sequalize中使用主键作为uuid面临实现模型的问题。

默认情况下,如果您的模型包含带有的键primaryKey: true,则sequelize假定类型INTEGER为的PK id

在您的情况下,您似乎希望制作自己的自定义PK。

在模型中使用以下内容:

var Todo = sequelize.define('Todo', {
    id: {
      primaryKey: true,
      type: DataTypes.UUID
    }
    // rest of properties
 });
Run Code Online (Sandbox Code Playgroud)

2)验证

调用post方法创建元素后,我在ID列中有一个空值,在测试列中有NULL ...

没有很多信息,不仅涉及查询,还涉及如何为数据库添加种子,因此很难明确回答。

但是,这test列对我来说并不奇怪null,因为您没有列出任何验证。因此,如果您设置种子/创建未设置test值的行,则它将为null

要创建验证,请执行以下操作

模型:

var Todo = sequelize.define('Todo', {
    // rest of properties
    test: {
      allowNull: false
      type: DataTypes.UUID,
      validate: {
        notNull: true
      }
    }
});
Run Code Online (Sandbox Code Playgroud)

移民:

queryInterface.createTable('Todos', {
    // rest of properties
    test: {
      allowNull: false,
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4
    }
});
Run Code Online (Sandbox Code Playgroud)

3)保持模型和迁移同步

(请参阅:https//stackoverflow.com/a/49796801/8954866)在中sequelize,模型和迁移不会自动彼此同步,除非最初使用生成时sequelize-cli model:generate。我不确定是否要运行迁移或是否在针对模型的单元测试中运行查询。但是您必须确保它们是同步的。一个主要的例子是,在上述情况下,您的迁移说的id是类型的UUID,但是您的模型会认为它是类型的INTEGER

参考文献