Sequelize自动为NOT NULL列设置默认值

时间:2019-05-21 15:40:01

标签: mysql node.js sequelize.js

我目前正在使用迁移创建的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},

我想收到官方文档中所述的错误,但不知道我在做什么错。

3 个答案:

答案 0 :(得分:1)

这可能在两种情况下发生。

首先,如果您在定义模型之后输入了 allowNull,那么您需要使用 sync({force: true}) 重新同步表。

其次,如果 allowNullemail 等属性未提供给 firstNamecreate() 将起作用。例如 create({email:'',firstName:''}) 将填充空值。但如果您执行 create({email:''}),则跳过 firstName 属性将导致验证错误。

如果您从 HTML 表单标记或其他内容中执行 create(req.body),并且如果没有传递任何值,则正文的 emailfirstName 字段默认设置为空字符串。然后将输入空值。由于 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;
};