PostgreSQL - SequelizeDatabaseError在连接表中出现(Code: 42P01)

9
我正在尝试为多对多关系创建联接表。 我遇到了以下错误:
"name": "SequelizeDatabaseError",
"parent": {
    "name": "error",
    "length": 110,
    "severity": "ERROR",
    "code": "42P01",
    "position": "13",
    "file": "parse_relation.c",
    "line": "1160",
    "routine": "parserOpenTable",
    "sql": "INSERT INTO \"user_routes\" (\"id\",\"userId\",\"routeId\",\"createdAt\",\"updatedAt\") VALUES (DEFAULT,'1','1','2017-11-15 03:57:21.791 +00:00','2017-11-15 03:57:21.791 +00:00') RETURNING *;"
},

这个关系是在UserRoute之间的:

module.exports = (sequelize, DataTypes) => {
  const Route = sequelize.define("Route", {
    open: {
      type: DataTypes.BOOLEAN,
      allowNull: true
    }
  });

  Route.associate = models => {
    Route.belongsToMany(models.User, {
      through: "userRoutes",
      as: "users"
    });
  };
  return Route;
};


module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define("User", {
    email: DataTypes.TEXT,
    password: DataTypes.TEXT
  });

  User.associate = models => {
    User.belongsToMany(models.Route, {
      through: "userRoutes",
      as: "routes"
    });
  };

  return User;
};

用户和路由的迁移文件并不复杂,只有基础内容。对于连接表:

"use strict";
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable("user_route", {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      userId: {
        type: Sequelize.INTEGER,
        onDelete: "CASCADE",
        references: {
          model: "Users",
          key: "id"
        }
      },
      routeId: {
        type: Sequelize.INTEGER,
        onDelete: "CASCADE",
        references: {
          model: "Routes",
          key: "id"
        }
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable("user_route");
  }
};

我的控制器和路由如下:

  create(req, res) {
    return UserRoutes.create({
      userId: req.body.userId,
      routeId: req.body.routeId
    })
      .then(userRoute => res.status(201).send(userRoute))
      .catch(err => res.status(400).send(err));
  },



app.post("/api/userRoutes", userRoutesController.create);

所以当我尝试发布到该路由时,我会在帖子顶部收到错误消息。

我觉得我有点弄清了问题所在。问题出在 Sequelize 和 Postgres 的命名约定上。某些内容没有被传输。这与多对多的关系无关。我一旦解决了这个问题,就会更新。 - leogoesger
3个回答

5

我曾遇到过同样的错误,并因为一个无关的问题而感到困惑(我的SQL语句中有单引号,而且所有单引号都被转义了,当我删除它们时查询可以运行,所以我专注于寻找一种去除转义的方法)。我的问题是我的迁移生成的表名违反了PostgreSQL的命名规范;当我更正了这个问题(我的表名第一个字母大写,所以我编辑了迁移以使用小写字母并重新运行它),错误就消失了。也许这可以解决你的问题?


2

在创建了数据库、模型和迁移之后,您需要运行

原始答案: Original Answer

sequelize db:migrate

在运行你的应用程序之前,请确保已经执行了原始答案中提到的操作,否则它会抛出SequelizeDatabaseError异常。

0
如果你看这一行代码:
"routine": "parserOpenTable"

打开表时会发生错误。 很可能是由于表的命名而引起的。 注意大写字母。

例如, "./models/user.js":tableName为 "users",但在数据库管理系统中,我们有一个名为 "Users" 的表。

只需更改tableName即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接