【问题标题】:PostgreSQL - SequelizeDatabaseError with join table (Code: 42P01)PostgreSQL - 带有连接表的 SequelizeDatabaseError(代码:42P01)
【发布时间】:2018-04-28 04:37:11
【问题描述】:

我正在尝试为多对多关系创建连接表。

我收到以下错误:

"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 中的命名约定。某些东西没有被转移。它与多对多关系无关。解决问题后我会更新。

标签: postgresql sequelize.js


【解决方案1】:

我遇到了同样的错误,并且同样被一个不相关的问题抛出(我的 SQL 子句有单引号,这些单引号都被转义了,而且,由于在我删除它们时查询运行,我专注于一种方法来删除转义)。我的问题是我的迁移是使用违反 PostgreSQL 命名约定的表名生成的;当我纠正这个问题时(我的表名中有一个大写的第一个字母,所以我将迁移编辑为一个小写的第一个字母并重新运行它),错误消失了。也许这可以解决你的问题?

【讨论】:

    【解决方案2】:

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

    sequelize db:migrate
    

    在运行您的应用程序之前。

    如果没有,会抛出上面提到的SequelizeDatabaseError

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 2020-08-02
      • 1970-01-01
      • 2011-08-03
      • 2021-01-14
      相关资源
      最近更新 更多