postgresql - 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 在这里没有按预期运行?
解决方案
推荐阅读
- webpack - 由于 webpack 导致 NPM 打包出错
- excel - 无法复制单个单元格并粘贴到范围内
- python - ModuleNotFoundError:Jupyter Notebook 没有名为“keras”的模块
- maven - 由于不可删除的文件,如何阻止 Maven Clean 失败?
- python - MySQL行列值格式到python字典
- python - 循环中不能进行变量赋值(for)
- python - Raspberry pi 中的功耗为零 w
- python - 如何在 mac 上的 python 虚拟环境中安装底图?
- php - Laravel 中的下拉年份列表不显示
- r - 如何将字符类型值(这是值:1,54E+17)转换为 R 中的数字?