使用Sequelize.js向PostgreSQL存数据失败:重复出现createdat/updatedat列
问题:Sequelize创建数据时出现重复时间列错误
使用Sequelize的BlogModel.create()方法向PostgreSQL数据库存储数据时失败,控制台输出的SQL语句中同时包含自定义的createdat、updatedat列与自动生成的createdAt、updatedAt列,导致重复列冲突。但在userBlogs模型中仅定义了createdat和updatedat各一次。
执行的SQL语句
Executing (default): INSERT INTO "userBlogs" ("id","email","blogdetails","tags","createdat","updatedat","createdAt","updatedAt") VALUES (DEFAULT,$1,$2,$3,$4,$5,$6,$7) RETURNING "id","email","blogdetails","tags","createdat","updatedat","createdAt","updatedAt";
相关代码
userBlogs.js
'use strict'; module.exports = (sequelize, DataTypes) => { const userBlogs = sequelize.define('userBlogs', { id: { type: DataTypes.INTEGER(10), allowNull: false, primaryKey: true, autoIncrement: true }, email: { type: DataTypes.STRING(255), allowNull: false }, blogdetails: { type: DataTypes.TEXT, allowNull: false }, tags: { type: DataTypes.STRING(255), allowNull: false }, createdat: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW }, updatedat: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW } }, { timestamps: true, tableName: 'userBlogs' }); return userBlogs; };
server.js
const usersBlogSchema = require('./modals/userBlogs'); const BlogModel = usersBlogSchema(sequelize, DataTypes); app.post('/service/createblogs', async (req, res, next)=> { try { const userEmail = req.body.email; const blogDetails = req.body.blogValue; const tags = req.body.tagValue; if (Object.keys(req.body).length === 0) { res.status(403).json({ fail: "Invalid blog request or blog request is blank !" }); } else { var requestData = {email:userEmail, blogdetails:blogDetails, tags:tags }; const createBlogRequest = await BlogModel.create(requestData); res.status(200).json({ success: true }); } } catch (e) { console.log(e) return next(e); } });
解决方案
核心原因是模型配置中开启了timestamps: true,这会让Sequelize自动生成并添加createdAt和updatedAt列;同时你手动定义了createdat和updatedat列,两者叠加导致重复列问题。
提供两种解决方式:
方式一:关闭自动时间戳功能
如果只想使用自定义的createdat和updatedat列,将模型配置中的timestamps: true改为timestamps: false,这样Sequelize就不会自动生成额外的时间列:
}, { timestamps: false, // 关闭自动时间戳 tableName: 'userBlogs' });
方式二:保留自动时间戳并映射到自定义列名
如果希望继续使用Sequelize的自动时间戳管理(自动更新时间),但想用小写的列名,可以在配置中指定列名映射,同时可以删除手动定义的createdat和updatedat列(让Sequelize自动管理):
}, { timestamps: true, tableName: 'userBlogs', createdAt: 'createdat', // 将自动生成的createdAt映射到表的createdat列 updatedAt: 'updatedat' // 将自动生成的updatedAt映射到表的updatedat列 });
若保留手动定义的列,需确保列名与映射配置一致,避免重复定义。
内容的提问来源于stack exchange,提问作者soccerway
相关产品推荐
相关产品推荐

