首页 > 解决方案 > 在 Sequelize 中使用模型和迁移

问题描述

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

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

我需要在模型中添加哪些列附加属性?例如,我认为我可以省略模型中的“allowNull”属性,但据我所知,如果我有一个作为主键的列(除了 id),我需要将它放在模型中。

那么我应该把哪个放在模型中,哪个不应该?

标签: modelsequelize.js

解决方案


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

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

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


推荐阅读