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
相关产品推荐
相关产品推荐

