You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Sequelize中model.findOne()的目标数据表名称?

解决Sequelize查询表名不匹配的问题

嘿,我懂你遇到的麻烦了——Sequelize有个默认的命名规则:它会把你的模型名自动复数化,来对应数据库里的表名。所以你的User模型(哪怕你定义模型时第一个参数填的是'user'),它还是会默认去查找users表,但你的数据库里实际是user表,这就导致了"table users does not exist"的报错。

要解决这个问题,只需要在定义模型的时候,显式指定对应的表名就可以了。修改你的User模型代码,在第三个参数的配置对象里加上tableName: 'user':

const Sequelize = require('sequelize')
const db = require('../database/db.js')
module.exports = db.sequelize.define(
  'user',
  {
    id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    name: { type: Sequelize.STRING },
    email: { type: Sequelize.STRING },
    username: { type: Sequelize.STRING },
    password: { type: Sequelize.STRING },
    address: { type: Sequelize.STRING },
    created: { type: Sequelize.DATE, defaultValue: Sequelize.NOW },
    role: { type: Sequelize.STRING }
  },
  { 
    timestamps: false,
    tableName: 'user' // 这里指定实际的表名
  }
)

这个配置会告诉Sequelize,不要自动复数化模型名,直接使用你指定的user作为查询的表名。这样你的findOne({ where: { email: req.body.email } })就会正确指向数据库里的user表,不会再报错啦。

另外补充一句:如果你有很多模型都不需要复数化,也可以在初始化Sequelize实例的时候,通过define: { freezeTableName: true }来全局关闭自动复数化,但针对单个模型单独指定tableName的方式更灵活,适合你现在的场景。

内容的提问来源于stack exchange,提问作者phoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:11:30