如何修改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
相关产品推荐
相关产品推荐

