Sequelize操作SQLite时如何自定义DATE字段的日期存储格式
解决方案
不需要在每次赋值时手动格式化日期,Sequelize提供了类型序列化的扩展入口,可以全局或单字段配置自定义日期存储格式,适配SQLite和Swift端的格式要求。
方案1:全局配置(推荐,全量DATE字段自动生效)
在初始化Sequelize实例后,重写DATE类型的序列化方法,仅在SQLite方言下替换为你需要的存储格式,原有业务代码完全不需要改动:
const { Sequelize, DataTypes } = require('sequelize'); const dayjs = require('dayjs'); // 初始化Sequelize实例 const sequelize = new Sequelize(/* 你的数据库连接配置 */); // 保留原有序列化逻辑做兼容 const defaultDateStringify = DataTypes.DATE.prototype.stringify; // 覆写DATE类型写入数据库的转换逻辑 DataTypes.DATE.prototype.stringify = function (value, options) { // 仅SQLite环境下、传入值为Date对象时使用自定义格式 if (options?.dialect === 'sqlite' && value instanceof Date) { return dayjs(value).format('YYYY-MM-DDTHH:mm:ss.SSS'); } // 其他场景走默认逻辑 return defaultDateStringify.call(this, value, options); };
配置完成后,原有的object.modified = new Date()、upsert逻辑完全不需要调整,Sequelize会自动将日期转为2022-06-14T18:52:44.816格式存入SQLite,读取时依然会自动解析为JS Date对象,不影响业务侧使用。
方案2:单字段配置(仅对指定字段生效)
如果不希望改动全局DATE类型的逻辑,可以在模型定义时给对应字段加读写转换器,单独指定存储格式:
// 模型定义 const MyType = sequelize.define('MyType', { // 其他字段... modified: { // 存储为固定格式字符串,避免Sequelize自动做默认日期转换 type: DataTypes.STRING, // 读取数据时自动转回JS Date对象,业务侧无感知 get() { const rawVal = this.getDataValue('modified'); return rawVal ? new Date(rawVal) : null; }, // 写入数据时自动格式化为目标格式 set(val) { if (val instanceof Date) { this.setDataValue('modified', dayjs(val).format('YYYY-MM-DDTHH:mm:ss.SSS')); } else { this.setDataValue('modified', val); } } } }, { /* 其他模型配置 */ });
注意事项
- 全局配置会作用于项目中所有使用
DataTypes.DATE的字段,若存在部分字段需要保留默认存储格式,选择单字段配置方案即可 - 两种方案都不会改变JS侧的Date对象使用逻辑,仅调整SQLite中存储的字符串格式,完全兼容Swift端的日期解析规则
内容的提问来源于stack exchange,提问作者Clifton Labrum
相关产品推荐
相关产品推荐

