首页 > 解决方案 > 连接表的 Sequelize 错误:DatabaseError [SequelizeDatabaseError]:列不存在

问题描述

我正在尝试运行以下代码块,由于某种原因,查询尝试将其插入标记为"users->user_group"."userUuid"的列中,尽管事实上我没有在项目(通过不在代码库中搜索),还检查 pg-admin 中的列(使用 PostgreSQL), user_group 表中的两个列都是user_uuidgroup_uuid,这两个列也都经过验证和正确填充。

const result = await group.findAll({
  include: user,
});

邮递员正文返回以下错误“提示”:“也许您的意思是引用列“users->user_group.user_uuid”。”,

我有 3 个模型用户、组和 user_group。这些关系已根据文档和无数其他文章和视频进行定义。

用户模型

module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define(
    "user",
    {
      uuid: {
        type: DataTypes.STRING,
        primaryKey: true,
        allowNull: false,
        unique: true,
      },
      username: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
    },
    {
      freezeTableName: true,
    }
  );

  user.associate = (models) => {
    user.belongsToMany(models.group, {
      // as: "userUuid",
      through: models.user_group,
      foreignKey: "user_uuid",
    });
  };

  return user;
};

团体模型

module.exports = (sequelize, DataTypes) => {
  const group = sequelize.define(
    "group",
    {
      uuid: {
        type: DataTypes.STRING,
        primaryKey: true,
        allowNull: false,
        unique: true,
      },
      title: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
      },
    },
    {
      freezeTableName: true,
    }
  );

  group.associate = (models) => {
    group.belongsToMany(models.user, {
      // as: "groupUuid",
      through: models.user_group,
      foreignKey: "group_uuid",
    });
  };

  return group;
};

用户组模型

module.exports = (sequelize, DataTypes) => {
  const user_group = sequelize.define(
    "user_group",
    {
      uuid: {
        type: DataTypes.STRING,
        primaryKey: true,
        allowNull: false,
        unique: true,
      },
      user_uuid: {
        type: DataTypes.STRING,
        allowNull: false,
        references: {
          model: "user",
          key: "uuid",
        },
      },
      group_uuid: {
        type: DataTypes.STRING,
        allowNull: false,
        references: {
          model: "group",
          key: "uuid",
        },
      },
      author: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: true,
      },
    },
    {
      freezeTableName: true,
    }
  );

  user_group.associate = (models) => {
    user_group.belongsTo(models.user, {
      foreignKey: "user_uuid",
    });
    user_group.belongsTo(models.group, {
      foreignKey: "group_uuid",
    });
  };

  return user_group;
};

非常感谢任何帮助,谢谢!

标签: node.jspostgresqlsequelize.js

解决方案


您应该指示otherKey选项以及foreignKeyinbelongsToMany以指示另一个模型上的外键列,否则您最终会得到另一个键的默认名称,见下文:

连接表中外键的名称(表示目标模型)或表示另一列的类型定义的对象(参见 Sequelize.define 的语法)。使用对象时,可以添加 name 属性来设置列的名称。默认为目标名称 + 目标主键(您的情况:user+ uuid

group.belongsToMany(models.user, {
      // as: "groupUuid",
      through: models.user_group,
      foreignKey: "group_uuid",
      otherKey: "user_uuid"
    });

推荐阅读