2016-11-19 134 views
0

我试图使用Seqelize和Postgresql将具有外键约束的user_id列添加到Node Express中的Todo表。 我收到一条错误消息,说“未处理的拒绝SequelizeDatabaseError:列”UserId“不存在”。正如你所看到的,SELECT查询中有“userId”和“UserId”。 "Unhandled rejection SequelizeDatabaseError: column "UserId" does not exist"使用Sequelize中的迁移添加具有外键约束的表列使用Sequelize中的迁移

SELECT查询由简单的Todo.findAll()构建。 我相信这件事情错在我如何迁移文件20161116202040 - 添加用户ID到todos.js

module.exports = { 
    up: function (queryInterface, Sequelize) { 
    return queryInterface.addColumn(
     'Todos', 
     'userId', { 
     type: Sequelize.INTEGER, 
     references: { 
      model: 'Users', 
      key: 'id'}})}, 

的模型/ user.js的看起来像这样创建外键约束上:

module.exports = function(sequelize, DataTypes) { 
    var User = sequelize.define('User', { 
    email: DataTypes.STRING, 
    password: DataTypes.STRING 
    }, { 
    classMethods: { 
     associate: function(models) { 
     User.hasMany(models.Todo);}}}); 
    return User;}; 

模型/ todo.js看起来是这样的:

module.exports = function(sequelize, DataTypes) { 
    var Todo = sequelize.define('Todo', { 
    name: DataTypes.STRING, 
    userId: DataTypes.INTEGER 
    },{ 
    classMethods: { 
     associate: function(models) { 
     Todo.belongsTo(models.User); }}}); 
    return Todo;}; 

回答

2

Sequelize有办法的相关模型通过模型名称相关联。

因此,例如

var User = sequelize.define('user', { ... }); 
var Todo = sequelize.define('todo', { ... }); 

Todo.belongsTo(User); 

// Will create/use `userId` in Todo table 

但在你的情况

,你必须在表名作为首都:

var User = sequelize.define('User', { ... }); 
var Todo = sequelize.define('Todo', { ... }); 

Todo.belongsTo(User); 

// Will create/use `UserId` in Todo table 

所以你的情况,你可以重命名userIdUserId或明确指定的外键像

Todo.belongsTo(models.User, { foreignKey: "userId" }); 
+0

谢谢。我想到了。在我看来,你还必须添加ForeignKey:“userId”User.hasMany调用权? – Andreas

相关问题