프로젝트 작업 중 시퀄라이즈 명령문에 따른 에러가 발생하였다.
알수없는 에러가 발생했습니다. 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 |