首页 > 解决方案 > sequelize 是否在数据库中创建约束?

问题描述

首先,我曾经使用 Django 作为 ORM 框架,django 为我处理一切......创建约束、表等......但是当我看到 sequelize 是一个 ORM 框架时,我决定改变一个使用 Express 的项目。

到目前为止,我正在使用迁移,但我可以看出这与 django 方式不同,我可以使用 cli 生成模型和第一次迁移,但我想创建带有约束等的整个表,有一种方法要做到这一点?还是“拥有”和“属于”功能仅从后端角度验证数据,而不是真正在后端创建约束?

另一件事是我真的必须使用迁移两次完成所有工作吗?我的意思是配置我的模型,然后配置迁移中的所有字段?

最后一件事,有没有办法清除数据库并重新运行迁移?没有迁移我可以使用 sync({force:true}) 但这不适用于迁移。

'use strict'
const {
  Model
} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class Foo extends Model {
    static associate (models) {
      models.Foo.belongsTo(models.Bar, { foreignKey: 'foo_id' });
    }
  };
  Foo.init({
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
    name: {
        type: DataTypes.STRING(100),
        allowNull: false,
        unique: true,
    },
  }, {
    sequelize,
    modelName: 'foo'
  })
  return Foo
}

const {
  Model
} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class Bar extends Model {
    static associate (models) { }
  };
  Bar.init({
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
    name: {
        type: DataTypes.STRING(100),
        allowNull: false,
        unique: true,
    },
  }, {
    sequelize,
    modelName: 'bar'
  })
  return Bar
}

迁移就像

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('foo', {
      id: {
        type: Sequelize.DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: Sequelize.DataTypes.STRING,
        allowNull: false,
        unique: true,
      },
    })
  },
  // How can i create my constraints here?
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('foo')
  }
};

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('bar', {
      id: {
        type: Sequelize.DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: Sequelize.DataTypes.STRING,
        allowNull: false,
        unique: true,
      },
      foo_id: {
        type: Sequelize.DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
    })
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('bar')
  }
};

标签: node.jsexpresssequelize.jssequelize-cli

解决方案


推荐阅读