在Sequelize中使用模型和迁移

时间:2019-08-06 21:45:19

标签: model sequelize.js

假设我正在创建一个用户模型,所以我创建了这样的迁移:

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      username: {
        allowNull: false,
        type: Sequelize.STRING,
        unique: true
      },
      phone: {
        allowNull: false,
        type: Sequelize.STRING(15),
        unique: true
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    })
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users')
  }
}

这是我的用户模型:

const Sequelize = require('sequelize')

class User extends Sequelize.Model {

  static init(sequelize, DataTypes) {
    return super.init({
      username: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true,
        validate: {
          is: /^[a-zA-Z0-9._]+$/,
          notNull: true,
          notEmpty: true
        }
      },
      phone: {
        type: DataTypes.STRING(15),
        allowNull: false,
        unique: true,
        validate: {
          notNull: true,
          notEmpty: true,
          max: 15
        }
      }
    }, { sequelize })
  }
}

module.exports = User

我需要在模型中的哪个列中添加其他属性?例如,我认为我可以在Model中省略'allowNull'属性,但是据我所知,如果我有一个作为主键(而不是id)的列,则需要将其放入模型中。 / p>

那我应该在模型中放哪一个而不是我呢?

1 个答案:

答案 0 :(得分:1)

迁移只是对数据库架构进行版本控制的一种方法。它可能包含与您的业务需求无关的定义(例如:如何自动生成ID字段,时间戳列等),但是其他所有内容都应该在模型中。

在您的示例中,我认为Sequelize不允许您省略allowNull,因为您具有禁止空值的验证。另外,如果您曾在模型中调用过sync(),则将在没有此约束的情况下创建表。

关于键,除非数据库知道如何为该列生成值,否则它也应该在模型中。