如何使用Sequelize

时间:2016-06-24 18:32:48

标签: node.js postgresql orm sequelize.js jsonb

我在NodeJS中使用Sequelize ORM来管理postgreSQL数据库。 我在我的表中使用JSONB数据类型,我需要一个关于JSONB字段的索引和一个关于这个JSON属性的唯一约束。 如果我必须在经典SQL中执行我的脚本:

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 个答案:

答案 0 :(得分:1)

这是我用Postgres和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',
    }
],