NodeJS 如何使用Sequelize在JSONB字段上创建UNIQUE约束

wfauudbj  于 2023-08-04  发布在  Node.js
关注(0)|答案(2)|浏览(158)

我正在使用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方法来执行原始查询,但这不是很进化。
任何帮助将不胜感激!

nnsrf1az

nnsrf1az1#

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

eh57zj3b

eh57zj3b2#

你必须做两件事。
1.将quoteIdentifiers设置为false。
1.在索引中将unique设置为true。
下面是完整的代码

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

const User = seq.define('User', {
  name: {
    type: Sequelize.STRING,
  },
  content: {
    type: Sequelize.JSONB,
  },
}, {
  indexes: [
    {
      fields: ['content'],
      using: 'gin',
      operator: 'jsonb_path_ops',
    },
    {
      fields: ['((content->>"name")::varchar)'],
      unique: true,
      name: 'content_name_idx',
    },
  ],
});

字符串

相关问题