与迁移文件相比,模型文件实际上做了什么?

hyrbngr7  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(371)

我使用sequelizecli迁移来处理mysql数据库。
如果我输入命令

sequelize init

创建了两个文件夹 models 以及 migrations 另外,如果我在两个模型之间设置关联,例如

User.hasMany(Posts)

我必须手动将外键添加到迁移文件中。
(但不是模型文件,对吗?)
此外,迁移文件中还有一些列,如created\u at、updated\u at
但不在模型文件中。
在使用方面 db.sync(); 没有这样的迁移文件,所以我不必手动将外键添加到模型文件中。
我知道迁移文件只涉及db表模式,但是模型文件实际上在做什么。。?
那个模型文件和db table无关吗?
我了解同步和迁移之间的区别,(同步删除所有表,如果force:true is 待设置,但不包括迁移)
但也许我没有理解内部发生了什么(迁移之间的模型)
任何建议都将不胜感激!

k5hmc34c

k5hmc34c1#

当您使用sequelize cli时,createdat和updatedat列已经为您创建,因为sequelize使用它们来更新表。你可以禁用它们。
sequelize模型文件不需要createdat和updatedat来定义sequelize所做的更改。
您必须手动将外键添加到迁移文件和模型中。模型文件是sequelize与数据库模式交互的参考。
它为sequelize设置参数,以触发对数据库的查询。可以说迁移文件与数据库模式有关,模型文件与数据库中存储的数据有关。
示例考虑用户表及其基本信息。
用户模型

module.exports = (sequelize, DataTypes) => {
  var Users = sequelize.define('users', {
    user_id: {
      type: DataTypes.STRING,
      primaryKey: true,
    },
   }, {});
  User.associate = function(models) {
    Users.hasOne(models.basicinfo, {
      foreignKey: 'user_id',
      as: 'BasicInfo'
    });
};
  return Users;
};

基本信息模型

module.exports = (sequelize, DataTypes) => {
  var basicinfo = sequelize.define('basicinfo', {
    first_name: {
      type: DataTypes.STRING,
    },
    last_name: {
      type: DataTypes.STRING,
    },
};{});
  basicinfo.associate = function (models) {
    basicinfo.belongsTo(models.users, {
      foreignKey: 'user_id',
      onDelete: 'CASCADE'
    });
  };
  return basicinfo;
};

希望这能消除你的困惑,你会学到更多,因为你使用这个伟大的图书馆。
下面是我对每个模型的迁移文件的更新答案。
用户迁移

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('users', {
      user_id: {
        type: Sequelize.STRING,
        primaryKey: true,
      },
  });
 },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('users');
  }
};

基本信息迁移

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('basicinfo', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      user_id: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true,
        onDelete: 'CASCADE',
        references: {
          model: 'users',
          key: 'user_id',
          as: 'user_id'
        }
      },
      profile_img: {
        type: Sequelize.STRING
      },
      first_name: {
        type: Sequelize.STRING,
      },
      last_name: {
        type: Sequelize.STRING,
      },
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('basicinfo');
  }
};

相关问题