在mysql数据库中将primarykey续写为uuid-不工作

yhqotfr8  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(301)

我在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;
};

和迁移文件:

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

调用post方法创建元素后,在id列中得到一个空值,在test列中得到null。。。
数据库是mysql。
还有别的办法吗?

rn0zuynd

rn0zuynd1#

确保package.json更新了uuid模块,这就是我的问题所在。

accessSecret: {
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
      allowNull: false,
      unique: true,
    },

这很好,只要确保package.json

"uuid": "^8.2.0",
gpnt7bae

gpnt7bae2#

1) 在sequelize中设置自定义键
我在sequalize中遇到了主键为uuid的实现模型的问题。
默认情况下,如果您的模型不包含 primaryKey: true ,那么 sequelize 假定pk类型为 INTEGER 命名 id .
在你的情况下,似乎你想让自己的定制pk。
在模型中使用以下选项:

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

2) 验证
调用post方法创建元素后,在id列中得到一个空值,在test列中得到null。。。
如果没有太多的信息,不仅是关于你的查询,而且是关于你是如何播种数据库的,很难具体回答。
然而,我并不惊讶 test 列为 null ,因为您尚未列出任何验证。因此,如果您对未设置 test 价值,它将是 null .
要创建验证,请执行以下操作
型号:

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

迁移:

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

3) 保持模型和迁移同步
(见:https://stackoverflow.com/a/49796801/8954866)在 sequelize ,模型和迁移不会自动彼此同步,除非最初使用 sequelize-cli model:generate . 我不确定您是运行了迁移,还是在针对模型的单元测试中运行了查询。但你必须确保它们是同步的。一个主要的例子是,在上述情况下,您的迁移 id 属于类型 UUID 但你的模特会认为这是 INTEGER .
参考文献
设置自定义主键
验证和分配

相关问题