Как создать ограничение UNIQUE для поля JSONB с помощью Sequelize

Я использую Sequelize ORM в NodeJS для управления базой данных 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));

Я нашел, как создать таблицу с ИНДЕКСОМ, но не нашел, как справиться с ограничением UNIQUE. Вот пример моего скрипта:

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

Есть ли решение моей проблемы? Если нет, я, вероятно, буду использовать метод sequenceize.query для выполнения необработанного запроса, но это не очень эволюционно.

Любая помощь будет оценена по достоинству!


person Maniolias    schedule 24.06.2016    source источник


Ответы (1)


Это обходной путь, который я использую для добавления индексов в поля JSONB с помощью Postgres и Sequelize.

Во-первых, установите для параметра quoteIdentifiers значение false в вашем клиенте Sequelize.

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',
    }
],
person Masklinn    schedule 07.12.2016