Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequelize Migration: relation <table> does not exist

I'm working through an Author hasMany Books example and am attempting to run a sequelize-cli migration, but am getting the following issue when I run the following migration:

ERROR: relation "authors" does not exist

This is the first migration to create an author:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Authors', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      firstName: {
        type: Sequelize.STRING
      },
      lastName: {
        type: Sequelize.STRING
      },
      dateOfBirth: {
        type: Sequelize.DATEONLY
      },
      dateOfDeath: {
        type: Sequelize.DATEONLY
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Authors');
  }
};

The second migration to create a book:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Books', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      title: {
        type: Sequelize.STRING
      },
      summary: {
        type: Sequelize.STRING
      },
      isbn: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Books');
  }
};

The migration to create the relationship between Author and Book:

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.addColumn(
      'Books', // name of source model
      'AuthorId',
      {
        type: Sequelize.INTEGER,
        references: {
          model: 'authors',
          key: 'id'
        },
        onUpdate: 'CASCADE',
        onDelete: 'SET NULL'
      }
    )
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.removeColumn(
      'Books',
      'AuthorId'
    )
  }
};

And these are my models:

author.js:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Author = sequelize.define('Author', {
    firstName: { type: DataTypes.STRING, allowNull: false, len: [2, 100] },
    lastName: { type: DataTypes.STRING, allowNull: false },
    dateOfBirth: { type: DataTypes.DATEONLY },
    dateOfDeath: { type: DataTypes.DATEONLY }
  }, {});
  Author.associate = function (models) {
    // associations can be defined here
    Author.hasMany(models.Book);
  };
  return Author;
};

book.js:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Book = sequelize.define('Book', {
    title: { type: DataTypes.STRING, allowNull: false, len: [2, 100], trim: true },
    summary: { type: DataTypes.STRING, allowNull: false },
    isbn: { type: DataTypes.STRING, allowNull: false }
  }, {});

  Book.associate = function (models) {
    // associations can be defined here
    Book.belongsTo(models.Author);
  };
  return Book;
};

I've tried all sorts of things to no avail. My guess would be that it is attempting to alter the table in an asynchronous manner, but the previous migrations ran and finished:

enter image description here

I'm using the following:

"pg": "^7.4.3"
"sequelize": "^4.37.10"
"sequelize-cli": "^4.0.0"
 "express": "~4.16.0"

I'm very new to sequelize and any help would be appreciated!

like image 569
MunkiPhD Avatar asked Jun 20 '18 14:06

MunkiPhD


People also ask

How to fix the relation does not exist error in Sequelize?

The relation does not exist error in Sequelize always happens when you refer to a PostgreSQL database table that doesn’t exist. When you encounter this error, the first thing to check is to make sure that the Sequelize code points to the right table name.

What does the error 'sequelizedatabaseerror' mean?

Although the code above is valid, Node will throw an error as follows: Error at Query.run ... name: 'SequelizeDatabaseError', parent: error: relation "Users" does not exist In PostgreSQL, a relation does not exist error happens when you reference a table name that can’t be found in the database you currently connect to.

What is Sequelize in SQL Server?

As others have mentioned, sequelize defaults to the plural form of a model as the table name. For instance Tree, becomes Trees. When you query, sequelize looks after a table with the same name as your model Tree.

What does relation does not exist mean in PostgreSQL?

In PostgreSQL, a relation does not exist error happens when you reference a table name that can’t be found in the database you currently connect to. In the case above, the error happens because Sequelize is trying to find Users table with an s, while the existing table is named User without an s.


1 Answers

You have created Authors table but referencing it with a small a. It should be like

references: {
  model: 'Authors',
  key: 'id'
},
like image 102
AbhinavD Avatar answered Nov 15 '22 04:11

AbhinavD