代码之家  ›  专栏  ›  技术社区  ›  jwkoo

表达模型文件和迁移文件相比实际做了什么?

  •  0
  • jwkoo  · 技术社区  · 7 年前

    在处理mysql数据库时,我使用的是sequelize cli迁移。

    如果我输入命令

    sequelize init
    

    将创建两个文件夹 models migrations

    另外,如果我在两个模型之间设置关联,例如

    User.hasMany(Posts)
    

    我必须手动将外键添加到迁移文件中。

    (但不是模型文件,对吗?)

    另外,迁移文件中也有列,如created\u at,updated_at

    但不在模型文件中。

    说到使用 db.sync();

    我知道同步和迁移之间的区别,(如果原力:真的是待设置但不迁移)

    但也许我没能理解内部是怎么回事(迁移之间的模型)

    任何建议都将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  2
  •   faizan baig    7 年前

    当您使用sequelize cli时,createdAt和updatedAt列已经为您创建,因为sequelize使用它们来更新表。你可以禁用它们。

    sequelize模型文件不需要createdAt和updatedAt来定义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');
      }
    };
    

    basicinfo迁移

    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');
      }
    };