node.js - Node.js Sequelize UUID 主键 + Postgres
问题描述
我尝试使用 sequelize 创建数据库模型,但我遇到了模型主键的问题。
环境
我在 docker 容器中使用 Postgres (v10),对模型使用 sequalize (Node.js v10.1.0),对请求处理使用 GraphQL (0.13.2) + GraphQL-Sequalize (8.1.0)。
问题
通过 sequelize-cli 创建模型后,我手动尝试将 id 列替换为 uuid。这是我正在使用的模型迁移。
'use strict';
const DataTypes = require('sequelize').DataTypes;
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Currencies', {
uuid: {
primaryKey: true,
type: Sequelize.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false
},
name: {
type: Sequelize.STRING
},
ticker: {
type: Sequelize.STRING
},
alt_tickers: {
type: Sequelize.ARRAY(Sequelize.STRING)
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Currencies');
}
};
模型:
'use strict';
module.exports = (sequelize, DataTypes) => {
const Currency = sequelize.define('Currency', {
uuid: DataTypes.UUID,
name: DataTypes.STRING,
ticker: DataTypes.STRING,
alt_tickers: DataTypes.ARRAY(DataTypes.STRING)
}, {});
Currency.associate = function(models) {
// associations can be defined here
};
return Currency;
};
由于一些问题,sequalize 执行下一个表达式:
执行(默认):SELECT "id", "uuid", "name", "ticker", "alt_tickers", "createdAt", "updatedAt" FROM "Currencies" AS "Currency" ORDER BY "Currency"."id"升序;
这会导致“列 'id' 不存在”错误。
或者,我尝试通过在迁移时将uuid列重命名为id来修复它:
...
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV4()
},
...
在模型中:
'use strict';
module.exports = (sequelize, DataTypes) => {
const Currency = sequelize.define('Currency', {
id: DataTypes.INTEGER,
name: DataTypes.STRING,
ticker: DataTypes.STRING,
alt_tickers: DataTypes.ARRAY(DataTypes.STRING)
}, {});
Currency.associate = function(models) {
// associations can be defined here
};
return Currency;
};
但结果是程序开始时出现以下错误:
错误:名为“id”的列已添加到“货币”的属性中,但未标记为“primaryKey:true”
问题
- 那么,有没有办法强制 sequelize 使用 UUID 作为表主键而不定义 id 列?
- 有没有办法创建没有 id 列的列?
- 什么可能导致此错误以及应如何解决?
提前致谢!
解决方案
您没有在此处发布的是您的model
代码。这就是我认为已经发生的事情
- 数据库已手动从 更改
id
为uuid
。 - 您的模型未反映此更改。
因此,查询同时搜索id
和uuid
。
您可以像下面那样在您的模型中修复我的定义uuid
并将其设为主键
const User = sequelize.define('user', {
uuid: {
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV1,
primaryKey: true
},
username: Sequelize.STRING,
});
sequelize.sync({ force: true })
.then(() => User.create({
username: 'test123'
}).then((user) => {
console.log(user);
}));
推荐阅读
- magento - Magento REST API - 如何确定 API 基本 URL?
- kubernetes - 如果资源限制超过节点容量,Kubernetes 是否会分配资源?
- reactjs - React - 可以将类中的自定义函数拆分到不同的文件中吗?
- c - 如何遍历多级链表?
- javascript - 将对象中的静态元素附加到对象数组中的每个对象
- c# - 如何修复 MVC 中的“AspNetCore.Views_Home_Index.ExecuteAsync()”NullReference 错误
- android - 添加 uCrop 和 Cometchat 库时出现 Gradle“重复类”错误
- python - 此 python 代码中的语法有什么问题?
- javascript - 如何在输入中创建起始值并在键盘输入时替换该值?
- django - 以 Django 形式传递和访问值