2016-06-24 6 views
1

Ich benutze die Sequelize ORM in NodeJS, um eine PostgreSQL-Datenbank zu verwalten. Ich verwende den JSONB-Datentyp in meiner Tabelle, ich brauche einen Index für das JSONB-Feld und eine eindeutige Einschränkung für eine Eigenschaft dieses JSON. Wenn ich in einem klassischen SQL hier mein Skript zu tun habe:So erstellen Sie eine UNIQUE Einschränkung für ein JSONB Feld mit Sequelize

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)); 

Ich habe festgestellt, wie die Tabelle mit dem Index erstellen, aber nicht, wie man mit der UNIQUE-Einschränkung umgehen. Hier ist ein Beispiel für mein Skript:

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

Gibt es eine Lösung für mein Problem? Wenn nicht, werde ich wahrscheinlich die sequelize.query-Methode verwenden, um eine rohe Abfrage auszuführen, aber das ist nicht sehr evolutiv.

Jede Hilfe wäre willkommen!

Antwort

1

Dies ist die Problemumgehung, die ich verwende, um Indizes für JSONB-Felder mit Postgres und Sequelize hinzuzufügen.

Setzen Sie zuerst die Option quoteIdentifiers in Ihrem Sequelize-Client auf false.

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

(Sehen Sie zwar heraus, das Ihr alle Tabellennamen Groß- und Kleinschreibung machen, wenn durch Sequelize.sync() erstellt)

Sie jetzt Indizes auf JSONB Felder auf diese Weise in Ihrem Modell Definition hinzufügen:

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