[내배캠] TIL, WIL/TIL

TIL

값싼외노자 2023. 2. 2. 17:25

프로젝트 작업 중 시퀄라이즈 명령문에 따른 에러가 발생하였다.

알수없는 에러가 발생했습니다. Error
    at Query.run (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\sequelize\lib\dialects\mysql\query.js:52:25)
    at C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\sequelize\lib\sequelize.js:314:28
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async MySQLQueryInterface.insert (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\sequelize\lib\dialects\abstract\query-interface.js:308:21)
    at async cart.save (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\sequelize\lib\model.js:2432:35)
    at async cart.create (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\sequelize\lib\model.js:1344:12)
    at async MypageRepository.add_cart (C:\Users\jh\Desktop\연습\SENSE2\sense2\src\layer\repositories\mypage.repository.js:11:24)
    at async MypageService.add_cart (C:\Users\jh\Desktop\연습\SENSE2\sense2\src\layer\services\mypage.service.js:15:22)
    at async add_cart (C:\Users\jh\Desktop\연습\SENSE2\sense2\src\layer\controllers\mypage.controller.js:33:22) {
  name: 'SequelizeDatabaseError',
  parent: Error: Table 'sense2.carts' doesn't exist
      at Packet.asError (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\packets\packet.js:728:17)
      at Prepare.execute (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\commands\command.js:29:26)
      at Connection.handlePacket (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\connection.js:487:32)
      at PacketParser.onPacket (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\connection.js:94:12)
      at PacketParser.executeStart (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\packet_parser.js:75:16)
      at Socket.<anonymous> (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\connection.js:101:25)
      at Socket.emit (node:events:513:28)
      at addChunk (node:internal/streams/readable:324:12)
      at readableAddChunk (node:internal/streams/readable:297:9)
      at Readable.push (node:internal/streams/readable:234:10) {
    code: 'ER_NO_SUCH_TABLE',
    errno: 1146,
    sqlState: '42S02',
    sqlMessage: "Table 'sense2.carts' doesn't exist",
    sql: 'INSERT INTO `carts` (`cart_id`,`user_id`,`lecture_id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?);',
    parameters: [ 1, 'test', '2023-02-02 08:13:43', '2023-02-02 08:13:43' ]
  },
  original: Error: Table 'sense2.carts' doesn't exist
      at Packet.asError (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\packets\packet.js:728:17)
      at Prepare.execute (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\commands\command.js:29:26)
      at Connection.handlePacket (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\connection.js:487:32)
      at PacketParser.onPacket (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\connection.js:94:12)
      at PacketParser.executeStart (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\packet_parser.js:75:16)
      at Socket.<anonymous> (C:\Users\jh\Desktop\연습\SENSE2\sense2\node_modules\mysql2\lib\connection.js:101:25)
      at Socket.emit (node:events:513:28)
      at addChunk (node:internal/streams/readable:324:12)
      at readableAddChunk (node:internal/streams/readable:297:9)
      at Readable.push (node:internal/streams/readable:234:10) {
    code: 'ER_NO_SUCH_TABLE',
    errno: 1146,
    sqlState: '42S02',
    sqlMessage: "Table 'sense2.carts' doesn't exist",
    sql: 'INSERT INTO `carts` (`cart_id`,`user_id`,`lecture_id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?);',
    parameters: [ 1, 'test', '2023-02-02 08:13:43', '2023-02-02 08:13:43' ]
  },
  sql: 'INSERT INTO `carts` (`cart_id`,`user_id`,`lecture_id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?);',
  parameters: [ 1, 'test', '2023-02-02 08:13:43', '2023-02-02 08:13:43' ]
}

 

이상하다 .. 왜 안되는 걸까 ? 모델명이나 DB의 테이블과 모델을 아무리 봐도 전혀 문제가 없어보인다.

 

그러다 에러 이유를 자세히 바라보았더니

sqlMessage: "Table 'sense2.carts' doesn't exist",

 parent: Error: Table 'sense2.carts' doesn't exist

sql: 'INSERT INTO `carts` (`cart_id`,`user_id`,`lecture_id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?);',

 

?

어째선지 sense2라는 데이터베이스의 carts 라는 테이블을 참고하다 해당 이름의 테이블이 없어 실행되지 않는 오류문인것 같다.

 

"use strict";
const { Model } = require("sequelize");

/**
 * @param {import("sequelize").Sequelize} sequelize - Sequelize
 * @param {import("sequelize").DataTypes} DataTypes - Sequelize Column DataTypes
 * @return {Model} - Sequelize Model
 * **/
module.exports = (sequelize, DataTypes) => {
  class cart extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  cart.init(
    {
      cart_id: {
        type: DataTypes.INTEGER,
        allowNull: false, // NOT NULL, Null을 허용하지 않음
        autoIncrement: true, // AUTO_INCREMENT
        primaryKey: true, // PRIMARY KEY, 기본키
      },
      user_id: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
      lecture_id: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
    },
    {
      sequelize,
      modelName: "cart",
    }
  );
  return cart;
};

ㄴ모델 정의

 

이상하다 모델 정의에도 테이블에도 분명 복수가 아닌 단수 cart인데 어째서 쿼리문은 carts로 작동하는걸까

 

디비버를 통해 데이터베이스에 직접 쿼리문을 작동해보았을땐 정상적으로 작동하는 것을 확인하였다

이 말은 저 쿼리문이 잘못되었다는건데.. 

그러하여 검색을 [시퀄라이즈 테이블s가 붙는 이유] 를 검색하였더니 해결방법이 나와있었다.

 

 

아래는 해결 방법 

---------------------------------------

모델 이름들은 모두 단수형인데 테이블 이름들은 모두 끝에 s가 붙어있는 것을 알 수 있다. 이것은 sequelize 객체가 자동으로 이렇게 처리하는 것인데 옵션으로 이 동작을 막을 수는 있다. Student.js 파일을 예로 들면

// student.js
~~~
Student.init(
    {
      registrationNum: DataTypes.STRING,
      name: DataTypes.STRING,
      age: DataTypes.INTEGER,
    },
    {
      sequelize,
      modelName: 'Student',
      freezeTableName: true,  // 
    }
  );
  return Student;
~~~

freezeTableName이라는 옵션에 true 값을 주면 된다. 말 그대로 sequelize 보고 굳이 단수형 단어를 복수형으로 바꾸지 말고 모델 이름 그대로 사용하라는 뜻이다. 혹시 이렇게 할 사람은 생성된 테이블들을 다 삭제하고 다시 코드를 실행하길 바란다.

---------------------------------------

 

 

cart 모델에

freezeTableName: true,

를 삽입하는 것.

 

 

삽입 후 cart 모델의 코드

"use strict";
const { Model } = require("sequelize");

/**
 * @param {import("sequelize").Sequelize} sequelize - Sequelize
 * @param {import("sequelize").DataTypes} DataTypes - Sequelize Column DataTypes
 * @return {Model} - Sequelize Model
 * **/
module.exports = (sequelize, DataTypes) => {
  class cart extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  cart.init(
    {
      cart_id: {
        type: DataTypes.INTEGER,
        allowNull: false, // NOT NULL, Null을 허용하지 않음
        autoIncrement: true, // AUTO_INCREMENT
        primaryKey: true, // PRIMARY KEY, 기본키
      },
      user_id: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
      lecture_id: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
    },
    {
      sequelize,
      modelName: "cart",
      freezeTableName: true,
    }
  );
  return cart;
};

 

해당 모델로 실행하니 정상적으로 작동되는 것을 확인하였다.

'[내배캠] TIL, WIL > TIL' 카테고리의 다른 글

Typescript - 유니온/교차 타입  (0) 2023.01.29
TypeScript  (0) 2023.01.17
노드JS 익스프레스 서버 에러 핸들링  (0) 2023.01.09
TIL  (0) 2023.01.09
TIL  (0) 2023.01.03