如何在Sequelize原生插入查询中正确保存日期?
解决Sequelize原生查询插入日期格式错误的问题
问题根源
直接把Date对象拼接到SQL字符串时,JavaScript会自动将其转为带英文时区描述的字符串(例如Thu Apr 20 2023 01:43:26 GMT+0530 (India Standard Time)),而PostgreSQL无法识别这种格式的时区标识,因此抛出错误。
可行解决方案
1. 使用Sequelize参数绑定(推荐)
避免直接拼接字符串,通过参数绑定让Sequelize自动处理日期格式,同时规避SQL注入风险:
const d = { createdAt: new Date(), updatedAt: new Date() }; const query = `insert into "PRODUCT" ("createdAt", "updatedAt", "PRODUCT_ID", "USER_ID") values (:createdAt, :updatedAt, :productId, :userId)`; let resp = await sequelize.query(query, { raw: true, type: sequelize.QueryTypes.INSERT, replacements: { createdAt: d.createdAt, updatedAt: d.updatedAt, productId: 1, userId: 1 } });
2. 手动转换日期为PostgreSQL兼容格式
如果必须手动拼接字符串,可将Date对象转为PostgreSQL能识别的格式:
const formatToPGDate = (date) => { // 直接转为ISO格式字符串,PostgreSQL可直接解析 return date.toISOString(); }; const d = { createdAt: formatToPGDate(new Date()), updatedAt: formatToPGDate(new Date()) }; const query = `insert into "PRODUCT" ("createdAt", "updatedAt", "PRODUCT_ID", "USER_ID") values ('${d.createdAt}','${d.updatedAt}', 1, 1)`; let resp = await sequelize.query(query, { raw: true, type: sequelize.QueryTypes.INSERT, });
注意:手动拼接字符串存在SQL注入风险,仅在特殊场景下使用。
3. 利用Sequelize内置日期处理工具
调用Sequelize自带的日期序列化方法,直接生成适配PostgreSQL的格式:
const { DataTypes } = require('sequelize'); const getPGFormattedDate = () => DataTypes.DATE.prototype._stringify(new Date(), 'postgres'); const d = { createdAt: getPGFormattedDate(), updatedAt: getPGFormattedDate() }; // 后续可结合参数绑定或字符串拼接使用
内容的提问来源于stack exchange,提问作者Renee
相关产品推荐
相关产品推荐

