2016-06-24 4 views
1

NodeJS에서 Sequelize ORM을 사용하여 postgreSQL 데이터베이스를 관리하고 있습니다. 테이블에서 JSONB 데이터 유형을 사용하고 있습니다. JSONB 필드에 대한 색인과이 JSON의 속성에 대한 고유 제한 조건이 필요합니다. 내가 여기에 고전 SQL 내 스크립트를해야 ​​할 경우Sequelize로 JSONB 필드에 UNIQUE 제약 조건을 만드는 방법

CREATE TABLE tableJson (id SERIAL PRIMARY KEY, 
         content JSONB NOT NULL); 
CREATE INDEX j_idx ON tableJson USING gin(content jsonb_path_ops); 
CREATE UNIQUE INDEX content_name_idx ON tableJson(((content->>'name')::varchar)); 

나는 INDEX하지만 어떻게 UNIQUE 제약 조건을 처리하는 방법과 테이블을 만드는 방법을 발견했습니다. 내 스크립트 샘플은 다음과 같습니다.

var tableJson = sequelize.define('tableJson', { 
    content: Sequelize.JSONB 
}, { 
    indexes: [{ 
     fields: ['content'], 
     using: 'gin', 
     operator: 'jsonb_path_ops' 
    } 
}); 

내 문제에 대한 해결책이 있습니까? 그렇지 않다면 아마도 원시 쿼리를 실행하기 위해 sequelize.query 메소드를 사용할 것입니다. 그러나 이것은 매우 진화 적이지 않습니다.

도움이 될 것입니다.

답변

1

Postgres 및 Sequelize를 사용하여 JSONB 필드에 색인을 추가하는 방법입니다.

먼저, Sequelize 클라이언트에서 quoteIdentifiers 옵션을 false로 설정하십시오.

:
const seq = new Sequelize(db, user, pass, { 
    host: host, 
    dialect: 'postgres', 
    quoteIdentifiers: false, 
}); 

이제 모델 정의에 JSONB 필드에 이런 식으로 인덱스를 추가 할 수 있습니다

(Sequelize.sync()에 의해 만들 때이 모든 테이블 이름 케이스를 구분하게됩니다,하지만 조심)

indexes: [ 
    { 
     fields: ['content'], 
     using: 'gin', 
     operator: 'jsonb_path_ops' 
    }, 
    { 
     fields: ['((content->>\'name\')::varchar)'], 
     unique: true, 
     name: 'content_name_idx', 
    } 
], 
관련 문제