我尝试使用sequelize创建数据库模型,但我遇到了模型主键的问题 .
设定
我在docker容器中使用Postgres(v10)并使用sequalize(Node.js v10.1.0)进行模型,使用GraphQL(0.13.2)GraphQL-Sequalize(8.1.0)进行请求处理 .
问题
在sequelize-cli创建模型后,我 manually tried to replace id column with uuid . 这里's my model migration that I'米使用 .
'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 “ASC;
这导致“列'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”的列已添加到“Currencies”的属性中,但未标记为“primaryKey:true”
问题
-
那么,有没有办法强制sequelize使用UUID作为表主键而不定义id列?
-
有没有办法创建没有id列的列?
-
可能导致此错误的原因以及如何解决?
提前致谢!
1 回答
你没有在这里发布的是你的
model
代码 . 这就是我认为发生的事情数据库已从
id
手动更改为uuid
.您的模型未反映此更改 .
因此查询正在搜索
id
和uuid
.你可以在你的模型中修复我的定义
uuid
,如下所示,并将其作为主键