2017-11-15 10 views
2

こんにちは、私は多対多の関係のための結合テーブルを作成しようとしています。私は、次のエラーを取得しています:結合テーブルでデータベースエラーを後遺症

"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 *;" 
}, 

関係はあまりなく、ただ基本を持っていないユーザーやルートの

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

User間と Route移行ファイルです。テーブルを結合するために:

"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); 

だから、私はポストの上にエラーメッセージが表示されます。必要に応じて詳細を提供することができます。

+0

私はこの種の問題を理解したと思います。問題はsequelizeとpostgresの命名規則にあります。何かが転送されていません。それは多対多の関係とは関係がありません。私は問題を解決したら更新します。 – Leogoesger

答えて

1

私が期待したように、問題はジョインテーブルとはあまり関係ありません。むしろ命名規則が使用されています。

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

代わりのthrough: "userRoutes"、それはuser_routeする必要があります。理由は、throughが移行テーブルによって作成されたデータベースをチェックしているためです。私のテーブルにはuserRoutesというものは含まれていませんでした。奇妙なことは、テーブルが存在しなかったと私に言っただけではありませんでした。

関連する問題