Dzulhilmi95
Dzulhilmi95

Reputation: 11

Sequelize PostgresSQL - Column does not exist when it does

I do not understand why my api is calling this column and not courseSection.courseId. from postman

enter image description here

I am building my project using AngularJs, PostgresSQL, NodeJs and Sequelize ORM.

This is my part of my course.contorller.js:

const db = require("../models");
const Course = db.course;
    
//view course catalogue 
exports.retrieveAll = (req, res) => {
    Course.findAll({
          include: [{
            model: db.courseSection,
            as: "courseSection"
          }, {
            model: db.category,
            as: "category"
          }]
        })
        .then(data => {
          res.send(data);
        })
        .catch(err => {
          res.status(500).send({
            message: err.message
          });
        }); };

This is my course.model.js

      module.exports = (sequelize, Sequelize) => {
          const Course = sequelize.define(
            "course",
            {
              courseId: {
                type: Sequelize.INTEGER,
                autoIncrement: true,
                primaryKey: true,
              },
              name: {
                type: Sequelize.STRING,
                allowNull: false,
                validate: {
                  notEmpty: true,
                },
              },
              description: {
                type: Sequelize.STRING,
              },
              creditPrice: {
                type: Sequelize.INTEGER,
              },
              isArchived: {
                type: Sequelize.BOOLEAN,
                defaultValue: false,
              },
              isDraft: {
                type: Sequelize.BOOLEAN,
              },
              level: {
                type: Sequelize.ENUM({
                  values: [
                    "PRIMARY 1",
                    "PRIMARY 2",
                    "PRIMARY 3",
                    "PRIMARY 4",
                    "PRIMARY 5",
                    "PRIMARY 6",
                  ],
                }),
              },
              createdAt: {
                type: Sequelize.DATE,
              },
              updatedAt: {
                type: Sequelize.DATE,
              },
            },
            {
              classMethods: {
                associate: function (models) {
                  Course.hasMany(models.CourseSection, {
                    foreignKey: "courseId",
                    onDelete: "CASCADE",
                  });
                  Course.hasMany(models.Material, {
                    foreignKey: "courseId",
                    onDelete: "CASCADE",
                  });
                  Course.hasMany(models.Review, {
                    foreignKey: "courseId",
                    onDelete: "CASCADE",
                  });
                  Course.hasMany(models.Enrolment, {
                    foreignKey: "courseId",
                    onDelete: "CASCADE",
                  });
                  Course.belongsTo(models.Category, {
                    foreignKey: "categoryId",
                    onDelete: "CASCADE",
                  });
                  Course.belongsTo(models.User, {
                    foreignKey: "userId",
                    onDelete: "CASCADE",
                  });
                },
              },
            }
          );
        
          return Course;
        };

My courseSection.js

    module.exports = (sequelize, Sequelize) => {
      const CourseSection = sequelize.define(
        "courseSection",
        {
          sectionId: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true,
          },
          name: {
            type: Sequelize.STRING,
            allowNull: false,
            validate: {
              notEmpty: true,
            },
          },
          isArchived: {
            type: Sequelize.BOOLEAN,
            defaultValue: false,
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        },
        {
          classMethods: {
            associate: function (models) {
              CourseSection.belongsTo(models.Course, {
                foreignKey: "courseId",
                onDelete: "CASCADE",
              });
            },
          },
        }
      );
    
      return CourseSection;
    };

My migration for course.js

    "use strict";
    
    //npx sequelize migration:generate --name course
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        return queryInterface.createTable("course", {
          courseId: {
            allowNull: false,
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true,
          },
          categoryId: {
            type: Sequelize.INTEGER,
            onDelete: "CASCADE",
            references: {
              model: "category",
              key: "categoryId",
            },
          },
          userId: {
            type: Sequelize.INTEGER,
            onDelete: "CASCADE",
            references: {
              model: "user",
              key: "userId",
            },
          },
          name: {
            type: Sequelize.STRING,
            allowNull: false,
            validate: {
              notEmpty: true,
            },
          },
          description: {
            type: Sequelize.STRING,
          },
          creditPrice: {
            type: Sequelize.INTEGER,
          },
          isArchived: {
            type: Sequelize.BOOLEAN,
            defaultValue: false,
          },
          isDraft: {
            type: Sequelize.BOOLEAN,
          },
          level: {
            type: Sequelize.ENUM({
              values: [
                "PRIMARY 1",
                "PRIMARY 2",
                "PRIMARY 3",
                "PRIMARY 4",
                "PRIMARY 5",
                "PRIMARY 6",
              ],
            }),
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        });
      },
    
      down: async (queryInterface, Sequelize) => {
        return queryInterface.dropTable("course");
      },
    };

My migration for courseSection

    "use strict";
    
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        return queryInterface.createTable("courseSection", {
          sectionId: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true,
          },
          name: {
            type: Sequelize.STRING,
            allowNull: false,
            validate: {
              notEmpty: true,
            },
          },
          courseId: {
            type: Sequelize.INTEGER,
            onDelete: "CASCADE",
            references: {
              model: "course",
              key: "courseId",
            },
          },
          isArchived: {
            type: Sequelize.BOOLEAN,
            defaultValue: false,
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        });
      },
    
      down: async (queryInterface, Sequelize) => {
        return queryInterface.dropTable("courseSection");
      },
    };

My index.js in /model

enter image description here

my postgres table:

enter image description here

When I do localhost:3000/courses/course, my vscode shows the following error:

Executing (default): SELECT "course"."courseId", "course"."name", "course"."description", "course"."creditPrice", "course"."isArchived", "course"."isDraft", "course"."level", "course"."createdAt", "course"."updatedAt", "course"."categoryCategoryId", "course"."categoryId", "course"."userId", "course"."userUserId", "courseSection"."sectionId" AS "courseSection.sectionId", "courseSection"."name" AS "courseSection.name", "courseSection"."isArchived" AS "courseSection.isArchived", "courseSection"."createdAt" AS "courseSection.createdAt", "courseSection"."updatedAt" AS "courseSection.updatedAt", "courseSection"."courseCourseId" AS "courseSection.courseCourseId", "courseSection"."courseId" AS "courseSection.courseId", "category"."categoryId" AS "category.categoryId", "category"."isArchived" AS "category.isArchived", "category"."name" AS "category.name", "category"."createdAt" AS "category.createdAt", "category"."updatedAt" AS "category.updatedAt" FROM "course" AS "course" LEFT OUTER JOIN "courseSection" AS "courseSection" ON "course"."courseId" = "courseSection"."courseCourseId" LEFT OUTER JOIN "category" AS "category" ON "course"."categoryId" = "category"."categoryId";

I have been on this problem for the past 2 days and I honestly do not know where I went wrong. I hope anyone can help me please.

Upvotes: 0

Views: 1286

Answers (1)

Anatoly
Anatoly

Reputation: 22803

You defined associations between courseSection and course twice:

  • in associate methods of a model classes (correct ones)
  • in index.js without indicating foreignKey option

I suppose you just need to remove associations in index.js and just call associate methods of models in index.js.

Something like

db.category.associate(db.models);
// and so on

Upvotes: 0

Related Questions