Node+PostgreSQL+Sequelize测试报错:relation 'Users'不存在
Sequelize报错:relation "Users" does not exist 解决方案
报错信息
Executing (default): INSERT INTO "Users" ("id","name","email","password_hash","admin","createdAt","updatedAt") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id","name","email","password_hash","admin","createdAt","updatedAt"; node:internal/process/promises:289 triggerUncaughtException(err, true /* fromPromise */); ^ Error name: 'SequelizeDatabaseError', parent: error: relation "Users" does not exist original: error: relation "Users" does not exist
问题分析与修复步骤
1. 数据库配置文件拼写错误
database.js中存在配置项拼写错误:freezeTimeTable应为freezeTableName,该配置用于禁止Sequelize自动将模型名复数化,拼写错误导致配置失效,模型仍在查找复数形式的Users表。
修复后的database.js:
module.exports = { dialect: "postgres", host: "localhost", username: "postgres", password: "jhschier", database: "jojosburger", define: { timestamps: true, underscore: true, underscoreAll: true, freezeTableName: true, // 修正拼写错误 }, };
2. User模型初始化参数错误
User.js中调用super.init时,错误地将配置项拆分为两个对象传入;同时存在无用的define导入,且未显式指定表名与迁移文件匹配。
修复后的User.js:
import Sequelize, { Model } from "sequelize"; class User extends Model { static init(sequelize) { super.init( { name: Sequelize.STRING, email: Sequelize.STRING, password_hash: Sequelize.STRING, admin: Sequelize.BOOLEAN, }, { sequelize, freezeTableName: true, tableName: "users", // 显式指定表名,与迁移文件一致 } ); } } export default User;
3. 路由优化(可选)
迁移文件中已设置id字段默认值为UUIDV4,无需手动传入id,可让数据库自动生成:
修复后的路由片段:
routes.get("/", async (request, response) => { const user = await User.create({ name: "JoJo", email: "jhschier30@hotmail.com", password_hash: "123321", admin: true, }); return response.json(user); });
最终验证
- 回滚迁移(若需要):
yarn sequelize db:migrate:undo - 重新执行迁移:
yarn sequelize db:migrate - 重启项目,访问
localhost:3000测试
内容的提问来源于stack exchange,提问作者JoJo
相关产品推荐
相关产品推荐

