ПОСЛЕДОВАТЕЛЬНЫЕ АССОЦИАЦИИ, НЕ СОЗДАННЫЕ В MYSQL, POSTGRESQL И SQLITE - PullRequest
0 голосов
/ 05 мая 2019

Я определяю ассоциации в моделях, используя sequalize с MYSQL.Но после миграции внешний ключ не добавляется в целевую модель, как описано в документации по сиквелизу.

Я также пытался вручную определить внешние ключи в моделях и файлах миграции, но связь между таблицами по-прежнему не создавалась.Когда я просматриваю таблицы в представлении отношений в PhpMyAdmin, не создаются ограничения внешнего ключа или отношения.

Я пробовал это с SQLite и PostgreSQL с теми же результатами.Я не знаю, что я делаю не так.Вот модели.

AURHOR MODEL
//One author hasMany books

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Author = sequelize.define('Author', {
    Name: DataTypes.STRING
  }, {});
  Author.associate = function(models) {
    // associations can be defined here
    Author.hasMany(models.Book)
  };
  return Author;
};

Я ожидаю, что сиквелиз добавит authorId в таблицу книг, как указано в документации, но этого не происходит

 BOOK MODEL
    //Book belongs to Author
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      const Book = sequelize.define('Book', {
        Title: DataTypes.STRING
      }, {});
      Book.associate = function(models) {
        // associations can be defined here
        Book.belongsTo(models.Author)
      };
      return Book;
    };

Не создано никаких связей между этими двумя таблицамипосле миграции.Я также попытался определить пользовательские внешние ключи в ассоциациях моделей следующим образом:

//Author model
    Author.hasMany(models.Book,{foreignKey:'AuthorId'})
 //Book model
 Book.belongsTo(models.Author,{foreignKey:'AuthorId'})

все еще это не решает проблему

Я пошел вперед, чтобы определить внешние ключи в моделях, а затем сослаться на нихв такой ассоциации:

  'use strict';
    module.exports = (sequelize, DataTypes) => {
      const Book = sequelize.define('Book', {
        Title: DataTypes.STRING,
        AuthorId:DataTypes.INTEGER
      }, {});
      Book.associate = function(models) {
        // associations can be defined here
        Book.belongsTo(models.Author,{foreignKey:'AuthorId'})
      };
      return 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
      },

      AuthorId:{
          type: Sequelize.INTEGER,
          references:{
          model:'Author',
          key:'id'
          }

      }

      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Books');
  }
};

Нокогда я запускаю такой тип настройки миграции, я получаю эту ошибку: ОШИБКА: невозможно создать таблицу dbname. books (ошибка: 150 «Ограничение внешнего ключа сформировано неправильно»)

Я получаюПодобная ошибка при переключении на PostgreSQL.

Эта проблема довольно долго меня сдерживала.Что я могу делать не так.Я использую sequelize версии 4.31.2 с последовательным CLI.

1 Ответ

0 голосов
/ 06 мая 2019

Я неправильно ссылался на модели в миграциях. Неправильный путь

 AuthorId:{
          type: Sequelize.INTEGER,
          references:{
          model:'Author',
          key:'id'
          }

      }

Правильный путь

  // Notes the model value is in lower case and plural just like the table name in the database
     AuthorId:{
              type: Sequelize.INTEGER,
              references:{
              **model:'authors',**
              key:'id'
              }

      }

Это решило мою проблему. Ассоциации теперь определены.

...