Sequelize查询PostgreSQL报错:column 'createdAt' does not exist
解决Sequelize查询PostgreSQL时"column 'createdAt' does not exist"错误
问题核心
数据库表中时间字段为全小写的createdat和updatedat,但Sequelize模型里使用驼峰命名的createdAt、updatedAt,导致生成的SQL语句引用了不存在的驼峰字段,触发字段匹配错误。
解决方法
方法1:给模型字段指定field属性映射数据库列
修改Gig模型,为createdAt和updatedAt添加field选项,明确对应数据库的小写列名:
import Sequelize from "sequelize"; import db from "../config/database.js"; const Gig = db.define("gig", { id: { type: Sequelize.INTEGER, primaryKey: true, }, title: { type: Sequelize.STRING, }, technologies: { type: Sequelize.STRING, }, budget: { type: Sequelize.STRING, }, description: { type: Sequelize.STRING, }, contact_email: { type: Sequelize.STRING, }, createdAt: { type: Sequelize.DATEONLY, field: 'createdat' // 映射数据库的createdat列 }, updatedAt: { type: Sequelize.DATEONLY, field: 'updatedat' // 映射数据库的updatedat列 }, }); export default Gig;
方法2:全局配置Sequelize命名规则(适用于多模型场景)
如果数据库所有表的时间字段都是无下划线的全小写格式,可在Sequelize初始化时开启underscored: true,让框架自动转换命名规则:
// config/database.js 初始化示例 import Sequelize from "sequelize"; const db = new Sequelize('你的数据库名', '用户名', '密码', { host: 'localhost', dialect: 'postgres', underscored: true // 驼峰字段自动映射为下划线小写列名 }); export default db;
注:该配置默认会将createdAt映射为created_at,如果你的数据库是无下划线的createdat,方法1的精准映射更适配。
方法3:修改数据库字段名(非必要不推荐)
若允许调整数据库结构,可将createdat、updatedat改为created_at、updated_at——这是Sequelize默认的下划线命名格式,无需额外配置即可匹配模型的驼峰字段。
验证效果
修改完成后重新运行查询,Sequelize生成的SQL会正确引用createdat和updatedat列,错误即可消除。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

