목차 열기
티스토리 뷰
728x90
반응형
Sequelize - MySQL Join
삽질하게된 계기
Inner Join을 위해 Node.js - Sequelize - MySQL를 사용중이다.
서로 다른 DB를 참조하기 위해 이것 저것 시도하다가 Define에 DB(Schema)의 이름을 넣을 수 있다는 것을 발견하였다.
2015년부터 문제되었던 것 같은데... 자세한건 GitHub를 참고하라.
문제의 Sequelize 구문
const model_statuses = db.define(
'common_statuses',
{
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
title: {
type: DataTypes.STRING,
allowNull: false
}
},
{
schema: '_common',
// tableName: 'common_statuses',
timestamps: false,
underscored: true
}
);
위의 schema: '_common',
이다. _common이라는 DB를 참조하는 것 까지는 좋았는데,
문제의 MySQL 쿼리
SELECT
/* ... 쿼리 ...
`examples`.`created`,
`_common`.`id` AS `_common.id`,
`_common`.`title` AS `_common.title`
*/ ... 쿼리 ...
FROM
`examples` AS `examples`
LEFT OUTER JOIN
`_common.Table` AS `_common` ON `examples`.`id` = `_common`.`id`
WHERE
`examples`.`id` = 3;
위의 FROM과 WHERE 사이의 이상한 점을 발견하였는가? 오류가 나는 구문이다.
오류가 생기는 이유
Sequelize에서는 백틱(`)으로 DB와 Table을 구분하지 않고, MySQL에서는 이를 인식하지 못한다.
`_common.Table` (Sequelize)
`_common`.`Table` (MySQL)
해결 방법
따라서, MySQL를 위한 옵션을 한 줄 추가해야 한다.
const db = new Sequelize(
'_common',
config.mysql.username,
config.mysql.password, {
host: config.mysql.host,
dialect: config.mysql.dialect,
port: config.mysql.port
}
);
db.dialect.supports.schemas = true; // 해당 옵션을 켜준다.
참고한 GitHub 링크
참고한 GitHub
https://github.com/sequelize/sequelize/issues/3023
728x90
반응형
'Server > MySQL' 카테고리의 다른 글
[MySQL] 실시간 쿼리 로그 보기 (0) | 2021.02.23 |
---|---|
[MariaDB] ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory") / 도커 (0) | 2021.02.01 |
[MySQL] Crontab으로 MySQL 자동 백업 / 크론탭 (0) | 2021.01.27 |
[MySQL] 계정 비밀번호 변경하기 (0) | 2021.01.24 |
[MySQL] No directory, logging in with HOME=/ 오류 메세지 (0) | 2021.01.24 |
[MySQL] 파일 위치 / 설정 / 로그 (0) | 2021.01.24 |
댓글