首页 文章

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

提问于
浏览
1

我正在尝试使用Sequelize和Postgresql将带有外键约束的user_id列添加到Node Express中的Todo表 . 我收到一条错误消息,说"Unhandled rejection SequelizeDatabaseError: column " UserId " does not exist" . 如您所见,SELECT查询中既有"userId"又有"UserId" .
"Unhandled rejection SequelizeDatabaseError: column "UserId" does not exist"

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'}})},

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

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

1 回答

  • 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
    

    因此,在您的情况下,您可以将 userId 重命名为 UserId 或明确指定foreignKey

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

相关问题