【问题标题】:Sequelize PostgresSQL - Column does not exist when it doesSequelize PostgresQL - 列不存在时
【发布时间】:2021-05-29 13:56:30
【问题描述】:

我不明白为什么我的 api 调用此列而不是 courseSection.courseId。来自邮递员

我正在使用 AngularJs、PostgresSQL、NodeJs 和 Sequelize ORM 构建我的项目。

这是我的 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
          });
        }); };

这是我的 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;
        };

我的 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;
    };

我的 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");
      },
    };

我的为 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");
      },
    };

我的 index.js 在 /model

我的 postgres 表:

当我执行 localhost:3000/courses/course 时,我的 vscode 显示以下错误:

执行(默认):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.名称”,“类别”。“createdAt”作为“category.createdAt”,“类别”。“updatedAt”作为“category.updatedAt”从“课程”作为“课程”左外连接“ courseSection" AS "courseSection" ON "course"."courseId" = "courseSection"."courseCourseId" 左外连接 "category" AS "category" ON "course"."categoryId" = "category"."categoryId";

过去两天我一直在处理这个问题,老实说,我不知道我哪里出错了。我希望任何人都可以帮助我。

【问题讨论】:

    标签: node.js angularjs postgresql sequelize.js


    【解决方案1】:

    您在courseSectioncourse 之间定义了两次关联:

    • 在模型类的associate 方法中(正确的)
    • index.js 中没有指明foreignKey 选项

    我想你只需要删除index.js 中的关联,然后调用index.js 中模型的associate 方法即可。

    类似

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

    【讨论】:

    • 嗨!非常感谢您的快速回复。您的意思是从我的 index.js 中删除整个部分吗?我这样做了,但现在我有一个错误说“courseSection 与课程无关!”尽管模型中有关联
    • 是的,有关联的整段代码。您是否为所有具有关联的模型添加了associate 调用?
    • 对不起,我可能会感到困惑或误解。我所有与其他模型关联的模型都正确关联。这个助理电话是什么,我应该把它放在哪里?我是否将这些关联调用 db.category.associate(db.models) 放在?
    • 我为我的霸道道歉!
    • 你应该为index.js中的所有模型调用associate(db.models)
    猜你喜欢
    • 2022-01-24
    • 2023-02-23
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多