如何在Node.js中使用Sequelize创建PostgreSQL的tstzrange[]类型值并存入数据库
解决Sequelize中tstzrange[]类型字段的赋值问题
你遇到的问题核心在于:直接传递[[new Date(), new Date()], ...]这种普通日期数组的数组时,Sequelize无法自动识别并转换为PostgreSQL的tstzrange[]类型,反而会将其解析成text[],导致类型不匹配报错。要正确创建符合要求的值,需要用Sequelize提供的Range类来构造每个时间范围对象。
具体解决步骤:
导入Range工具类
首先从Sequelize中引入Range类,它是专门用来处理PostgreSQL范围类型的工具:// CommonJS 写法 const { Sequelize, DataType, Range } = require('sequelize'); // ES模块写法 import { Sequelize, DataType, Range } from 'sequelize';用Range构造时间范围数组
每个时间范围都需要通过Range实例来表示,再将这些实例组合成数组,赋值给availability字段:// 创建符合tstzrange[]要求的取值 const availability = [ // 默认是闭区间,对应PostgreSQL的'[]'格式 new Range(new Date(), new Date()), // 左闭右开,和PostgreSQL tstzrange的默认行为一致 new Range(new Date(), new Date(), '[)'), // 开区间,对应PostgreSQL的'()'格式 new Range(new Date(), new Date(), '()') ]; // 写入数据库的示例代码 await YourModel.create({ // 其他字段... availability: availability });模型定义无需修改
你之前的模型定义是正确的,保持原样即可:@Column({ type: DataType.ARRAY(DataType.RANGE(DataType.DATE)) }) availability: Range[];
为什么这样能解决问题?
Sequelize的Range类会自动将对象序列化为PostgreSQL可识别的范围格式(比如"[2024-05-20T00:00:00.000Z,2024-05-21T00:00:00.000Z)"),数组中的多个Range实例会被正确转换为tstzrange[]类型,彻底避免了被误解析成text[]的问题。
内容的提问来源于stack exchange,提问作者Bousha
相关产品推荐
相关产品推荐

