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

Sequelize中defaultValue: DataTypes.NOW不生效问题求助

问题:Sequelize模型中date_created列默认值未生效

我尝试创建一个模型,其中date_created列用于存储创建日期,但设置defaultValue: DataTypes.NOW后,该列未成功添加默认值。以下是我的模型代码及生成的表结构描述,请问我遗漏了什么?

模型代码

const { Model, DataTypes } = require('sequelize');
const sequelize = require('../config/connection');

class Post extends Model {}

Post.init(
    {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true,
        },
        title: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        content: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        date_created: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
        user_id: {
            type: DataTypes.INTEGER,
            references: {
                model: 'user',
                key: 'id',
            },
        },
    },
    {
        sequelize,
        timestamps: false,
        freezeTableName: true,
        underscored: true,
        modelName: 'post',
    }
);

module.exports = Post;

生成的表结构

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int          | NO   | PRI | NULL    | auto_increment |
| title        | varchar(255) | NO   |     | NULL    |                |
| content      | varchar(255) | NO   |     | NULL    |                |
| date_created | datetime     | NO   |     | NULL    |                |
| user_id      | int          | YES  | MUL | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

解决方案

1. 修正默认值的写法

DataTypes.NOW在部分场景下无法被数据库正确解析为当前时间函数,改用Sequelize的literal()方法直接传入原生SQL表达式:

修改date_created字段配置:

date_created: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: sequelize.literal('CURRENT_TIMESTAMP'),
},

2. 同步表结构

如果表已提前创建,需要让Sequelize重新同步以应用修改:

  • 开发环境可使用强制同步(会删除并重建表,生产环境禁用):
    sequelize.sync({ force: true });
    
  • 或者手动执行SQL语句修改表结构:
    ALTER TABLE post MODIFY COLUMN date_created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
    

3. 补充说明

不同数据库对日期默认值的语法有差异,CURRENT_TIMESTAMP是MySQL、PostgreSQL等主流数据库通用的当前时间函数。使用sequelize.literal()能确保表达式直接被数据库执行,避免Sequelize类型转换的兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:25