IT/오류 컬렉터 조르디

[node.js] ERROR: The dialect [object Object] is not supported. Supported dialects: mssql, mariadb, mysql, oracle, postgres, db2 and sqlite.

토끼개발자 조르디 2024. 10. 10. 18:24

오류의 회전목마

DB 를 수정할게 있어서 models 안의 파일 코드를 수정하고 호기롭게 node backend/server.js 를 실행했다.

서버가 포트   {     }   에서 실행 중이라고 잘 뜨길래 mysql workbench 를 확인해봤는데,

 

????

 

수정한 코드가 아무것도 반영되어있지 않았다.

 

흐음.... 저번에는 그냥 반영되던데.... 뭐지? 싶어서 바로 지피티에게 물어봤다.

그랬더니 마이그레이션을 진행하지 않아서 그렇다고 하면서, 마이그레이션을 진행하라고 했다.

 

npx sequelize-cli db:migrat

 

아하! 그렇군. 

그래서 바로 마이그레이션을 진행했는데, 어라?

 

ERROR

 

 

얘네들의 주특기인 특정 파일을 찾을 수 없다는 말과 함께 sequelize init 을 했냐고 묻는다.

 

나는 폴더 구조를 그냥 직접 만들어서 한거라 sequelize init 을 하지 않았었다. 예리한녀석

그래서 그 문제인가? 싶어서 init 을 했는데.....

 

zsh: command not found: sequelize     라길래 또 물어봤더니 다른 걸 알려주었다. 그걸 실행.

 

npx sequelize-cli init

 

그러자 아래와 같은 내용이 터미널에 출력되었다.

 

Created "config/config.json" Successfully created models folder at "/Users/jordy/Desktop/workspace/koweb/models". Successfully created migrations folder at "/Users/jordy/Desktop/workspace/koweb/migrations". Successfully created seeders folder at "/Users/jordy/Desktop/workspace/koweb/seeders".

 

호오... config 파일이 생겼네. 마이그레이션 폴더도 생기고. 근데 모델 폴더도 또 생겼네? seeders 는 뭐지?

라고 생각하며 마이그레이션 파일을 생성했다.

 

첫번째 실행

 

그랬더니 migration 폴더에 파일이 생성되었다. 그런데 나는 백엔드 폴더 내부에 migration 폴더가 있었으면 해서 다시 그 안에 폴더를 수작업으로 만들고 다시 새로운 파일을 생성했다.

 

경로설정 후 재실행

 

무언가 잘 되어간다고 생각하고 이제 마이그레이션을 시켰는데.

역시나. 클리셰 발동.

 

바로 오류가 나왔다. 아까 뜬 것과 똑같은 오류였다.

 

다시만난오류

 

 

 

흐음.... 느낌상 저 config 파일을 실행해서 DB 와 연결하는 것 같은데....
그러면 database.js 파일로 실행파일을 바꿔야겠다.

 

 

 

난 아래의 코드를 터미널에 입력했다.

npx sequelize-cli db:migrate --config backend/config/database.js

 

그리고 만난 기가 막힌 오류

 

ERROR: The dialect [object Object] is not supported. Supported dialects: mssql, mariadb, mysql, oracle, postgres, db2 and sqlite.

 

예???

 

Error

 

dialect 설정이 뭐가 이상하단다.... 

아니, 전에는 잘만 연결되던게 왜 안된다는 건데?

 

여기서부터 난 이놈이 범상치 않다는 것을 느낄 수 있었다. 꽤나 내 속을 썩이겠군 자네.

 

require('dotenv').config();

const { Sequelize } = require('sequelize');

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mysql'  // Ensure this is a string
});

module.exports = sequelize;

 

 

분명히 잘 되어있는데 뭐 어쩌라는거임 ;;;;

화가 나기 시작했다. ㅋㅋㅋㅋㅋ

 

심지어 서버 접속도 되는데, 뭐가 문제니 도대체....

집착광공처럼 같은 코드를 5번 치고나서야 나는 한층 차분한 마음으로 이 문제에 대해서 생각해볼 수 있었다.

 

일단 구글링을 하자 !!

 

https://stackoverflow.com/questions/51177425/sequelize-migrate-failing-due-to-dialect-object-object-not-supported-error

 

Sequelize migrate failing due to dialect object Object not supported error

Background I am creating a boilerplate express application. I have configured a database connection using pg and sequelize. When I add the cli and try to run sequlize db:migrate I get this error,

stackoverflow.com

 

https://stackoverflow.com/questions/75648309/error-the-dialect-object-object-is-not-supported-supported-dialects-mssql

 

ERROR: The dialect [object Object] is not supported. Supported dialects: mssql, mariadb, mysql, oracle, postgres, db2 and sqlite

When I try to run sequelize db:migrate In the cli, I get this error;  ERROR: The dialect [object Object] is not supported. Supported dialects: mssql, mariadb, mysql, oracle, postgres, db2 and sqlit...

stackoverflow.com

 

나와 같은 문제를 겪어서 화가난 외국인 분들을 만날 수 있었다.

그렇지만,,,,, ^^  다들 파일 구조를 바꾸고,,, 어쨌든 config 파일을 만들거나 뭐 다른 실행파일을 만들거나 database.js 코드를 바꾸라는 이야기로 가득해보였다. 왠지따라하기싫은걸?

 

나는 차분하게 두가지의 경우의 수로 정리했다.

 


 

1. config.json 파일을 만들어서 그냥 해결하자.

그냥 저 파일을 만들어서 DB 에 연결하도록 하고 gitignore 에 저 파일을 등록해서 유출을 막자.

 

2. 마이그레이션 안 하는 방법은 없나? ㅋㅎㅎ

뭔가 그냥 이 구조 그대로 진행하고 싶은데 마이그레이션 안 하는 방법은 없을까?

 

 


 

글을 읽는 여러분이라면 어떤 방법을 채택할 것 같은가?

 

나는 일단, 기본 DB 구조를 변경하는 상황이었고 안에 데이터도 없을 뿐더러 협업이 아닌 혼자 개발하고 있었기 때문에

그냥 2번을 하기로 했다. 물론,,,, 시간이 있을때 1번으로 수정하는걸로~ 생각했다. ㅎㅎㅎ

그냥빨리오류해결하고싶다고~

 

마이그레이션 방식과 Sequelize의 sync 메서드를 사용하여 데이터베이스와 모델을 동기화하는 방식의 차이에 관련된 글도

조만간 작성해야겠다 ㅋㅋㅋㅋ

 

 

Sequelize의 sync 메서드를 사용하여 데이터베이스와 모델을 동기화

서버 파일(server.js 또는 app.js)을 아래의 코드처럼 수정한다.

이렇게 수정하면 서버가 시작될 때 데이터베이스와 모델이 동기화되며, 변경 사항이 반영된다.

const express = require('express');
const sequelize = require('./config/database'); // 데이터베이스 설정 파일
const Report = require('./models/report'); // 모델 파일

const app = express();

// ... 기타 설정 ...

// 데이터베이스와 모델 동기화
sequelize.sync({ alter: true }) // alter: true를 사용하면 기존 테이블을 수정합니다.
  .then(() => {
    console.log('Database & tables created or updated!');
  })
  .catch(err => {
    console.error('Error syncing database:', err);
  });

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

 

변경 사항 설명

sequelize.sync({ alter: true }):

- sync 메서드에 alter: true 옵션을 추가하여 기존 테이블의 구조를 수정할 수 있도록 설정

- 이 옵션을 사용하면 모델의 변경 사항이 데이터베이스에 반영됩니다.


.catch(err => {...}):

- 데이터베이스 동기화 중 오류가 발생할 경우를 대비하여 오류를 처리하는 코드를 추가

- 이를 통해 동기화 중 발생할 수 있는 문제를 로그로 확인 가능


 

서버 실행

 

서버를 실행하여 데이터베이스와 모델 동기화 

node backend/server.js

 

 

실행 결과

터미널에 DB 수정이 이루어지는 긴 출력문이 나오더니, 서버가 실행중이라는 문구 등장!!!

기쁜 마음으로 mysql workbench 로 달려갔다 

 

오예!

 

코드 수정이 이루어진 부분이 반영되었다!!

 

사실 왜 dialect 설정 오류가 뜨는지 근본적인 원인을 찾은게 아니라 조금은 찝찝하지만, 일단 해결했으니 안심 ㅎㅎ

나중에 config 파일을 만들던지해서 다시는 저 오류가 뜨지 않도록 만들어야겠다 ^^^^

 

API 개발은 따라서 내일부터!! ㅋㅋㅋ

아직 퍼블리싱 코드도 안 넘어오기도 했고~

 

내일부터!