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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:11:04