我正面临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列中得到一个空值,在测试列中得到NULL ...
Datebase是MySql。
还有其他办法吗?
答案 0 :(得分:3)
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
});
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
}
}
});
迁移:
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
。
<强>参考强>
答案 1 :(得分:0)
确保您的package.json已更新uuid模块,就我而言,这就是问题所在。
accessSecret: {
type: DataTypes.UUID,
defaultValue: Sequelize.UUIDV4,
allowNull: false,
unique: true,
},
这很好用, 只要确保package.json有
"uuid": "^8.2.0",
答案 2 :(得分:0)
如果你使用的是PostgreSQL的数据库,请看代码:
syntax error at or near "SERIAL" with autoIncrement only
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('users', {
id: {
type: Sequelize.UUID,
defaultValyue: Sequelize.literal('uuid_generate_v1mc()'),
primaryKey: true,
autoIncrement: true, // ERROR: syntax error at or near "SERIAL", if not commented it; remove it
},
email: Sequelize.STRING(30),
created_at: Sequelize.DATE,
updated_at: Sequelize.DATE,
});
},
down: async queryInterface => {
await queryInterface.dropTable('users');
},
};