如何使用sequelize v6以ES6语法关联模型

Myl*_*ith 5 postgresql node.js sequelize.js sequelize-cli es6-class

我在express/nuxt Web应用程序中使用sequelize ORM 6.4.0和CLI 6.2.0。(另外:节点 14.15.3、npm 6.14.11)。

背景:目标是制作一个 Web 应用程序,用于创建 mariokart 锦标赛并跟踪有关各个赛车手在不同赛道、车辆等上的表现的数据。问题是围绕 postgres/sequelize 关联以及正确创建/使用它们。

我正在尝试创建一个“赛车”模型,该模型具有来自车辆表的默认车辆。我在我的表中使用 postgres,并且使用 API 的express和sequelize创建表或与表交互时没有遇到任何问题。

这是我的 racer.js 模型:

'use strict'
const {
  Model
} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class Racer extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate (models) {
      // define association here
      this.belongsTo(models.Vehicle, {
        foreignKey: 'vehicleName',
        as: 'defaultVehicle'
      })
    }
  };
  Racer.init({
    name: DataTypes.STRING,
    nickname: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'Racer'
  })
  return Racer
}
Run Code Online (Sandbox Code Playgroud)

我的vehicle.js模型:

'use strict'
const {
  Model
} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class Vehicle extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate (models) {
      // define association here
      this.hasMany(models.Racer)
    }
  };
  Vehicle.init({
    vehicleName: DataTypes.STRING,
    vehicleSize: DataTypes.STRING,
    vehicleClass: DataTypes.STRING,
    vehicleClass2: DataTypes.STRING,
    vehicleSpeed: DataTypes.INTEGER,
    vehicleWeight: DataTypes.INTEGER,
    vehicleAcceleration: DataTypes.INTEGER,
    vehicleHandling: DataTypes.INTEGER,
    vehicleDrift: DataTypes.INTEGER,
    vehicleOffroad: DataTypes.INTEGER,
    vehicleMiniturbo: DataTypes.INTEGER
  }, {
    sequelize,
    modelName: 'Vechile'
  })
  return Vehicle
}
Run Code Online (Sandbox Code Playgroud)

当我在 pgadmin 中查看表时,我没有看到 defaultVehicle 列,如果我尝试播种该值,则会抛出“错误:关系“Racers”的列“defaultVehicle”不存在”

我尝试过弄乱名称,以防它是大写/复数形式,但情况似乎并非如此。我正在努力寻找任何有帮助的文档,大多数续集文档都使用旧的 .define 语法(我尝试这样做主要是因为这是我使用 CLI 时生成的框架,而且似乎是前进的最佳实践) 。我缺少什么?如果您能帮助我,请提前致谢,我快要疯了,即将跳过所有表关联并提取所有数据,然后手动进行代码验证。

and*_*s_v 5

我有一个非常类似的问题,我使用迁移文件解决了这个问题。这就是我根据问题的表格和数据所做的调整:

在 racer.js 模型中:

static associate (models) {
  // define association here
  this.belongsTo(models.Vehicle); // This is to add a VehicleId attribute to Racer to hold the primary key value for Vehicle
}
Run Code Online (Sandbox Code Playgroud)

然后在赛车手的迁移文件中(名为 20210429015612-create-racer.js):

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('Racers', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      nickname: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
    // And here's where the trick takes place:
    await queryInterface.addColumn(
      'Racer', // name of Source model
      'VehicleId', // name of the key we're adding 
      {
        type: Sequelize.INTEGER,
        references: {
          model: 'Vehicle', // name of Target model
          key: 'id', // key in Target model that we're referencing
        },
        onUpdate: 'CASCADE',
        onDelete: 'SET NULL',
      }
    );
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('Racers');
    await queryInterface.removeColumn(
      'Racers', // name of Source model
      'VehicleId' // key we want to remove
    );
  }
};
Run Code Online (Sandbox Code Playgroud)

完成此修改后,我必须在控制台中运行

node_modules/.bin/sequelize db:migrate:undo

运行 down 函数以删除赛车手的表,然后重新运行

node_modules/.bin/sequelize db:migrate

就是这样,如果您再次转到 pdAdmin 并刷新表,您将在 Racers 表中看到字段 VehicleId。

如需进一步参考,请查看此人的文章。