我目前正在使用迁移创建的MySQL数据库上运行Sequelize.js代码。我有一张桌子,上面有这样定义的人:
return queryInterface.createTable('Persons', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
unique: true,
type: Sequelize.INTEGER
},
email: {
allowNull: false,
unique: true,
type: Sequelize.STRING
},
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
,结果表如下:
`Persons` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`firstName` varchar(255) DEFAULT NULL,
`lastName` varchar(255) DEFAULT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `email` (`email`)
)
当我使用Model.create({})将条目添加到数据库时(括号之间没有任何内容),以下对象将添加到数据库中:
id email firstName lastName createdAt updatedAt
1 '' NULL NULL 2019-05-21 15:33:13 2019-05-21 15:33:13
我数据库中的每个NOT NULL列都获得一个默认值(对于varchar为空字符串,对于布尔值为false,对于日期时间为NOW())。
The Sequelize.js docs声明以下内容:
将allowNull设置为false将为该列添加NOT NULL,这意味着如果该列为null,则在执行查询时将从数据库引发错误。如果要在查询数据库之前检查值是否不为null,请查看下面的验证部分。
title:{类型:Sequelize.STRING,allowNull:false},
我想收到官方文档中所述的错误,但不知道我在做什么错。
答案 0 :(得分:1)
这可能在两种情况下发生。
首先,如果您在定义模型之后输入了 allowNull
,那么您需要使用 sync({force: true})
重新同步表。
其次,如果 allowNull
和 email
等属性未提供给 firstName
,create()
将起作用。例如 create({email:'',firstName:''})
将填充空值。但如果您执行 create({email:''})
,则跳过 firstName
属性将导致验证错误。
如果您从 HTML 表单标记或其他内容中执行 create(req.body)
,并且如果没有传递任何值,则正文的 email
和 firstName
字段默认设置为空字符串。然后将输入空值。由于 sequelize 不会将 req.body
对象中的空字符串值视为 null
值。
您可以通过在验证中添加 notEmpty: true
来调整验证以避免此类行为,如下所示。
email: {
allowNull: false,
unique: true,
type: Sequelize.STRING
validate : {
notEmpty: true
}
或者您可以通过将 allowNull
放在如下所示的验证属性中来执行以下小技巧,它会起作用;)
email: {
unique: true,
type: Sequelize.STRING
validate : {
allowNull: false
}
希望我说清楚:)
答案 1 :(得分:0)
如果您覆盖默认值,则会出现错误:
email: {
allowNull: false,
unique: true,
defaultValue: null,
type: Sequelize.STRING
},
答案 2 :(得分:0)
我解决了这个问题。
我必须在模型定义中添加allowNull。第一次尝试时,这会产生一些声明问题,但是现在,在再次尝试该问题后,我得到了正确的错误。
module.exports = (sequelize, DataTypes) => {
const Persons = sequelize.define('Persons', {
email: {
type: DataTypes.STRING(100),
allowNull: false
},
firstName: DataTypes.STRING(40),
lastName: DataTypes.STRING(40)
}, {});
return Persons;
};