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

Bra*_*mmz 4 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
      }
    });
Run Code Online (Sandbox Code Playgroud)

结果表如下所示:

`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`)
)
Run Code Online (Sandbox Code Playgroud)

当我使用 Model.create({})(括号内没有任何内容)向数据库添加条目时,以下对象将添加到数据库中:

id  email   firstName   lastName    createdAt   updatedAt
1   ''      NULL        NULL        2019-05-21 15:33:13 2019-05-21 15:33:13
Run Code Online (Sandbox Code Playgroud)

我的数据库中的每个 NOT NULL 列都有一个默认值(varchar 为空字符串,布尔值为 false,日期时间为 NOW())。

Sequelize.js 文档声明如下:

将allowNull 设置为false 将向该列添加NOT NULL,这意味着如果该列为空,则在执行查询时将从数据库抛出错误。如果您想在查询数据库之前检查某个值是否为空,请查看下面的验证部分。

标题:{ 类型:Sequelize.STRING,allowNull:false },

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

Bra*_*mmz 7

我解决了这个问题。

我不得不将 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;
};
Run Code Online (Sandbox Code Playgroud)