Sequelize如何将日期格式化为YYYY-MM-DD HH:mm:ss且时间戳字段保持蛇形命名
问题原因
你遇到的报错是因为Sequelize的define方法第三个参数(模型全局配置项)中的createdAt/updatedAt属性仅支持布尔值(控制是否启用该时间字段)或字符串(自定义模型层面的字段名),不支持直接传入字段配置对象,你的字段配置放错了位置。
正确实现方案
1. 调整字段配置位置
将createdAt、updatedAt的字段定义移到第二个参数(表字段定义对象)中,第三个参数仅保留全局配置即可。如果需要自动将驼峰字段映射为蛇形数据库列,可以开启underscored: true,无需手动指定field属性。
2. 秒级时间存储实现
不需要手动写setter处理毫秒去除,直接将DATE类型的精度设置为0即可,Postgres会自动存储为YYYY-MM-DD HH:mm:ss格式,不会带毫秒部分。
3. 完整正确代码
const Supplier = sequelize.define('Supplier', { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, allowNull: false, primaryKey: true }, name: { type: DataTypes.STRING, allowNull: false, unique: true, validate: { len: [1, 50] } }, description: { type: DataTypes.STRING, allowNull: true, }, // 时间字段移到此处定义 createdAt: { type: DataTypes.DATE(0), // 精度0表示秒级,自动去掉毫秒 allowNull: false, defaultValue: sequelize.NOW, // 若不开启underscored自动映射,手动添加 field: 'created_at' 即可 get() { // 若需要查询返回时直接是格式化后的字符串,保留这个getter,不需要可以删掉 return this.getDataValue('createdAt').toISOString().replace(/\..+/g, '').replace('T', ' '); } }, updatedAt: { type: DataTypes.DATE(0), allowNull: false, defaultValue: sequelize.NOW, get() { return this.getDataValue('updatedAt').toISOString().replace(/\..+/g, '').replace('T', ' '); } } }, { tableName: 'suppliers', timestamps: true, underscored: true, // 开启后自动将驼峰字段映射为蛇形数据库列,createdAt自动对应created_at // freezeTableName: true // paranoid: true });
补充说明
如果不需要查询时自动返回格式化字符串,删掉字段里的get方法即可,数据库存储的本身就是秒级时间格式,你可以在业务代码里按需处理转换。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

