목차 열기

티스토리 뷰

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
반응형
댓글
글 보관함
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Total
Today
Yesterday