2016-06-24 40 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

這是我用於在PostgreSQL和Sequelize的JSONB字段上添加索引的解決方法。

首先,在Sequelize客戶端中將quoteIdentifiers選項設置爲false。

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

(小心,雖然,這會讓你的所有的表名不區分大小寫時Sequelize.sync()創建)

現在,您可以JSONB領域這樣在你的模型定義添加索引:

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