Sequelize не видит внешний ключ при создании дочерней сущности - PullRequest
1 голос
/ 11 октября 2019

Пожалуйста, помогите решить проблему. Существуют модели отделов и сотрудников

module.exports = (sequelize, DataTypes) => {
var Department = sequelize.define('Department', {
name: DataTypes.STRING,
description: DataTypes.STRING
});

Department.associate = function(models) {
Department.hasMany(models.employee);
};

return Department;
};


module.exports = (sequelize, DataTypes) => {
var Employee = sequelize.define('Employee', {
name: DataTypes.STRING,
age: DataTypes.INTEGER,
depart: DataTypes.STRING
});

Employee.associate = function (models) {
Employee.belongsTo(models.department, {
  foreignKey: {
    allowNull: false
  }
});
};


return Employee;
};

Там же написаны ассоциации, что в одном отделе может быть несколько рабочих мест, в одном из них только один отдел.

далее в процессе миграции я добавляю DepartmentId

module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable("Employees", {
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: Sequelize.INTEGER
  },
  name: {
    type: Sequelize.STRING
  },
  age: {
    type: Sequelize.INTEGER
  },
  depart: {
    type: Sequelize.STRING
  },
  createdAt: {
    allowNull: false,
    type: Sequelize.DATE
  },
  updatedAt: {
    allowNull: false,
    type: Sequelize.DATE
  },
  DepartmentId: {
    type: Sequelize.INTEGER,
    allowNull: false,
    references: {
      model: 'Departments',
      key: 'id'
    }
  }
 });
 },
 down: (queryInterface, Sequelize) => {
 return queryInterface.dropTable("Employees");
 }
 };

далее в контроллере я вызываю функцию, которая должна создавать в моей базе данных электронные письма с DepartmentId

module.exports.createEmployee = async (req, res) => {
  if (!req.body) {
    return res.status(400).json({ massage: "Employee body is required" 
});
  }
 try {
    const employee = await Employee.create({
      name: req.body.name,
      age: req.body.age,
      depart: req.body.depart,
      DepartmentId: req.body.DepartmentId
    });

Я отправляю запрос через Почтальона

{"name": "teqwest1", "age": "121", "part ":" qwew1qweqweqe "," DepartmentID ":" 1 "}

, что приводит к ошибке

original: {error: нулевое значение в столбце «DepartmentId» нарушает ненулевое ограничение в Connection.parseE (/home/vitalik/node/node_modules/pg/lib/connection.js:604:11) в Connection.parseMessage (/ home /vitalik / node / node_modules / pg / lib / connection.js: 401: 19) в сокете. (/home/vitalik/node/node_modules/pg/lib/connection.js:121:22) в Socket.emit (events.js: 198: 13) в addChunk (_stream_readable.js: 288: 12) в readableAddChunk (_stream_readable).js: 269: 11) в Socket.Readable.push (_stream_readable.js: 224: 10) в TCP.onStreamRead [as onread] (внутренний / stream_base_commons.js: 94: 17) имя: «ошибка», длина: 280, уровень серьезности: «ОШИБКА», код: «23502», подробности: «Недостающая строка содержит (62, teqwest1, 121, qwew1qweqweqe, 2019-10-11 14: 51: 37.856 + 00, 2019-10-11 14:51:37.856 + 00, null). ', Подсказка: не определено, позиция: не определено, internalPosition: undefined, internalQuery: undefined, где: undefined, схема:' public ', таблица:' Employees ', столбец:' DepartmentId ', dataType: undefined, ограничение: undefined, файл: 'execMain.c', строка: '2017', подпрограмма: 'ExecConstraints', sql: 'INSERT INTO "Сотрудники" ("id", "name", "age", "ухода","creationAt", "updatedAt") ЗНАЧЕНИЯ (ПО УМОЛЧАНИЮ, $ 1, $ 2, $ 3, $ 4, $ 5) RETURNING *; ', параметры: [' teqwest1 ',' 121 ',' qwew1qweqweqe ',' 2019-10-11 14:51: 37,856 +00: 00 ',' 2019-10-11 14: 51: 37.856 +00: 00 ']}, sql:' INSERT INTO "Сотрудники" ("id", "name", "age", "уйти", "creationAt", "updatedAt") ЗНАЧЕНИЯ (ПО УМОЛЧАНИЮ, $ 1, $ 2, $ 3, $ 4, $ 5) ВОЗВРАЩЕНИЕ *; ', параметры: [' teqwest1 ',' 121 ',' qwew1qweqweqe ',' 2019-10-11 14: 51: 37.856 +00: 00',' 2019-10-11 14: 51: 37.856 +00: 00 ']}

Стек:

Nodejs

Экспресс

Postgres

Sequelize

Как решить эту проблему, что бы создать в базе данных с внешним ключом DepartmentId?

1 Ответ

0 голосов
/ 11 октября 2019
module.exports = (sequelize, DataTypes) => {
  const Department = sequelize.define('Department', {
    id: {
      type: DataTypes.STRING,
      primaryKey: true,
    },
    name: DataTypes.STRING,
    description: DataTypes.STRING
  });

  Department.associate = (models) => {
    models.Department.hasMany(models.Employee);
  };

  return Department;
};


module.exports = (sequelize, DataTypes) => {
  const Employee = sequelize.define('Employee', {
    name: DataTypes.STRING,
    age: DataTypes.INTEGER,
  });

  Employee.associate = (models) => {
    models.Employee.belongsTo(models.Department, {
      foreignKey: {
        name: 'depart',
        allowNull: false
      }
    });
  };

  return Employee;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...