Sequelize.js SequelizeDatabaseError:关系“设备”不存在
我正在使用Sequelize,我有以下代码: 迁移文件:Sequelize.js SequelizeDatabaseError:关系“设备”不存在,sequelize.js,exists,relation,Sequelize.js,Exists,Relation,我正在使用Sequelize,我有以下代码: 迁移文件: 'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('equipments', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement
'use strict'
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('equipments', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
hostname: {
type: Sequelize.STRING,
allowNull: false,
unique: true
},
vendor: {
type: Sequelize.STRING,
allowNull: false
},
model: {
type: Sequelize.STRING,
allowNull: false
},
equipment_class_id: {
type: Sequelize.INTEGER,
allowNUll: false,
references: { model: 'equipment_classes' }
},
created_at: {
type: Sequelize.DATE,
allowNull: false
},
updated_at: {
type: Sequelize.DATE,
allowNull: false
}
})
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('equipments')
}
}
模型设备:
const { Model, DataTypes } = require('sequelize')
class Equipment extends Model {
static init (sequelize) {
super.init({
hostname: DataTypes.STRING,
vendor: DataTypes.STRING,
model: DataTypes.STRING,
equipmentClassId: {
type: DataTypes.INTEGER,
field: 'equipment_class_id'
}
}, {
sequelize
})
}
}
module.exports = Equipment
在数据库中,创建了名为equipments的表
CREATE TABLE public.equipments
(
id integer NOT NULL DEFAULT nextval('equipments_id_seq'::regclass),
hostname character varying(255) COLLATE pg_catalog."default" NOT NULL,
vendor character varying(255) COLLATE pg_catalog."default" NOT NULL,
model character varying(255) COLLATE pg_catalog."default" NOT NULL,
equipment_class_id integer,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
CONSTRAINT equipments_pkey PRIMARY KEY (id),
CONSTRAINT equipments_hostname_key UNIQUE (hostname)
,
CONSTRAINT equipments_equipment_class_id_fkey FOREIGN KEY (equipment_class_id)
REFERENCES public.equipment_classes (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
当我运行此代码时:
async index (req, res) {
const equipments = await Equipment.findAll()
return res.json(equipments)
}
我收到错误:
Executing (default): SELECT "id", "hostname", "vendor", "model", "equipment_class_id" AS "equipmentClassId", "created_at" AS "createdAt", "updated_at" AS "updatedAt" FROM "equipment" AS "Equipment";
(node:17032) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: relation "equipment" does not exist
我的数据库:Postgresql 12
我有其他类似创建的表,我没有这个问题,我做错了什么
保罗你的问题是命名。Sequelize使用自动将模型的名称重写到数据库表 在迁移过程中,您有: 返回queryInterface.createTable“设备” 但你的模型有: 类设备扩展模型{ 命名约定使要在数据库中查找的模型中的名称多元化。因此,在迁移文件中,您应该有:
'use strict'
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('equipments', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
hostname: {
type: Sequelize.STRING,
allowNull: false,
unique: true
},
vendor: {
type: Sequelize.STRING,
allowNull: false
},
model: {
type: Sequelize.STRING,
allowNull: false
},
equipment_class_id: {
type: Sequelize.INTEGER,
allowNUll: false,
references: { model: 'equipment_classes' }
},
created_at: {
type: Sequelize.DATE,
allowNull: false
},
updated_at: {
type: Sequelize.DATE,
allowNull: false
}
})
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('equipments')
}
}
返回queryInterface.createTable“设备”
设备是单数设备的复数形式
您还可以通过使用sequelize cli来简化这一过程
使用sequelize cli,您不必担心命名约定。只需运行以下命令,将属性列表替换为属性列表:
续集模型:生成-命名设备-属性乐趣:字符串,完成:整数
它应该为您处理多元化,生成迁移和模型文件。此外,您可能需要在createTable中将其定义为设备,而不是设备。如果您不使用Sequalize cli设置所有内容,我不确定它将如何重写大写字母。