首页 > 解决方案 > Sequelize 不会创建唯一约束

问题描述

我正在尝试使用 sequelize 在我的 postgres DB 中的多个列上创建唯一约束。这里的说明很清楚,但它们不起作用。这是我的迁移文件的样子:

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('scores', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      opp: {
        type: Sequelize.INTEGER,
        allowNull: false,
        unique: 'compositeScoreIndex'
      },
      oppt: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: 'compositeScoreIndex'
      },
      tree: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: 'compositeScoreIndex'
      },
      version: {
        type: Sequelize.INTEGER,
        allowNull: false,
        unique: 'compositeScoreIndex'
      },
      score: {
        type: Sequelize.JSON,
        allowNull: false
      }
    }, {
      indexes: [{
          unique: true,
          fields: ['opp', 'oppt', 'tree', 'version']
      }]
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('scores');
  }
};

这应该等同于这个查询:

CREATE TABLE scores (id INT PRIMARY KEY NOT NULL, opp INT NOT NULL,
oppt TEXT NOT NULL, tree TEXT NOT NULL, version INT NOT NULL, score
JSON NOT NULL, CONSTRAINT uniq_scores UNIQUE(opp, oppt, tree, version));

但是 sequelize 迁移无法创建约束。我能够在 opp、oppt、tree 和 version 中创建具有相同值的多行。还有人看到这个吗?

更新:我能够让迁移打印出 SQL 查询的日志语句。这是它使用上述迁移文件运行的 CREATE TABLE 查询:

CREATE TABLE IF NOT EXISTS "scores" ("id"   SERIAL , "oppId" INTEGER NOT NULL,
"oppType" VARCHAR(255) NOT NULL, "tree" VARCHAR(255) NOT NULL,
"version" INTEGER NOT NULL, "score" JSON NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id"));

显然没有提到唯一约束。任何人都知道为什么 Sequelize 在这里没有按预期运行?

标签: postgresqlsequelize.jsunique-constraintsequelize-cli

解决方案


推荐阅读