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。
还有其他方法吗?
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。
参考文献