Estoy usando Sequelize ORM 6.4.0 y CLI 6.2.0 en una aplicación web express/nuxt. (También: Nodo 14.15.3, npm 6.14.11).
Antecedentes: el objetivo es crear una aplicación web para crear torneos de mariokart y realizar un seguimiento de los datos sobre el rendimiento de los corredores individuales en diferentes pistas, vehículos, etc.
Estoy tratando de crear un modelo de "corredor" que tenga un vehículo predeterminado que sea de la tabla de vehículos. Estoy usando postgres para mis tablas y no tengo problemas para crear o interactuar con mis tablas usando express y sequelize para la API.
Aquí está mi modelo 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 }Mi modelo de vehículo.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 }Cuando veo mis tablas en pgadmin, no veo una columna de vehículo predeterminado y si trato de generar el valor, arrojé "ERROR: la columna "vehículo predeterminado" de la relación "Corredores" no existe"
Intenté jugar con los nombres en caso de que fuera una cosa de mayúsculas/pluralización, pero ese no parece ser el caso. Estoy luchando por encontrar cualquier documentación que ayude, la mayoría de los documentos de secuela están usando la antigua sintaxis .define (estoy intentando esto principalmente porque este es el esqueleto que se genera cuando uso la CLI y parece que las mejores prácticas avanzan) . ¿Qué me estoy perdiendo? Gracias de antemano si pueden ayudar. Me estoy volviendo loco y estoy a punto de omitir las asociaciones de tablas por completo y extraer todos los datos y luego codificar las validaciones manualmente.
Tuve un problema muy similar que resolví usando el archivo de migración. Esto es lo que hice adaptado a las tablas y datos de la pregunta:
En el modelo 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 }Luego, en el archivo de migración del corredor (llamado algo así como 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 ); } };Después de hacer esta modificación tuve que ejecutar en la consola
node_modules/.bin/sequelize db:migrar:deshacer
para ejecutar la función hacia abajo para dejar caer la mesa de los corredores y luego volver a ejecutar
node_modules/.bin/sequelize db:migrar
Y eso es todo, si vuelve a ir a pdAdmin y actualiza las tablas, verá el campo VehicleId en la tabla Racers.
Para obtener más información, consulte el artículo de este tipo.