在 Sequelize 中使用迁移添加具有外键约束的表列

And*_*eas 1 postgresql node.js express sequelize.js

我正在尝试使用 Sequelize 和 Postgresql 将带有外键约束的 user_id 列添加到 Node Express 中的 Todo 表。我收到一条错误消息,指出“未处理的拒绝 SequelizeDatabaseError:列“UserId”不存在”。如您所见,SELECT 查询中同时包含“userId”和“UserId”。 “未处理的拒绝 SequelizeDatabaseError:列“UserId”不存在”

SELECT 查询是由一个简单的 Todo.findAll() 构建的。我认为我在迁移文件 20161116202040-add-user-id-to-todos.js 中创建外键约束的方式有问题

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

models/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;};
Run Code Online (Sandbox Code Playgroud)

模型/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;};
Run Code Online (Sandbox Code Playgroud)

dri*_*hev 5

Sequelize 有一种通过模型名称关联相关模型的方法。

所以例如

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

Todo.belongsTo(User);

// Will create/use `userId` in Todo table
Run Code Online (Sandbox Code Playgroud)

但是在您将表名作为大写的情况下:

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

Todo.belongsTo(User);

// Will create/use `UserId` in Todo table
Run Code Online (Sandbox Code Playgroud)

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

Todo.belongsTo(models.User, { foreignKey: "userId" });
Run Code Online (Sandbox Code Playgroud)