我尝试使用sequelize创建数据库模型,但是在模型的主键方面遇到了问题。
环境
我在Docker容器中使用Postgres(v10),使用sequelize(Node.js v10.1.0)创建模型并使用GraphQL(0.13.2)+GraphQL-Sequalize(8.1.0)进行请求处理。
问题
在使用sequelize-cli创建模型后,我手动尝试用uuid替换id列。这是我正在使用的模型迁移。
'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;
};
但程序启动时出现了以下错误:
错误:在“Currencies”的属性中添加了名为“id”的列,但未标记为“primaryKey:true”
问题
- 有没有办法强制sequelize使用UUID作为表的主键而不定义id列?
- 有没有办法创建不带id列的列?
- 可能是什么原因导致了这些错误,应该如何修复它?
提前感谢!
id
字段?应该是uuid
。您还应该将其设置为主键primaryKey: true
。 - AbhinavD