我在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方法来执行原始查询,但这不是很好的演变。
任何帮助将不胜感激!
答案 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',
}
],