Drizzle ORM日期筛选问题:如何类型安全查询PostgreSQL中特定时间范围的记录?
Drizzle ORM日期筛选问题:如何类型安全查询PostgreSQL中特定时间范围的记录?
老哥,我之前也踩过这个坑!你误以为Drizzle的between()只支持整数是不对的,它其实支持所有可比较的类型,包括日期/时间,问题出在类型匹配上,我给你说两种类型安全的解决办法:
方法1:适配现有Schema的字符串模式
你的created字段用了mode: "string",这意味着Drizzle会把数据库的timestamp类型映射为带时区的ISO 8601字符串。所以只要保证startDate和endDate是同格式的字符串,直接用between()就完全没问题:
// 先把日期转成符合要求的ISO字符串(带时区) const startDate = new Date('2024-01-01T00:00:00Z').toISOString(); const endDate = new Date('2024-01-31T23:59:59Z').toISOString(); // 类型安全的查询,完全保留Drizzle的类型检查 const customers = await db .select() .from(customers) .where(between(customers.created, startDate, endDate));
这个写法会生成和你raw SQL完全一致的BETWEEN语句,但同时能享受到Drizzle的类型推断——返回的customers数组会严格匹配你定义的表结构类型,不会像raw SQL那样丢失类型信息。
方法2:修改Schema为Date对象模式
如果你更习惯直接在代码里用Date对象而不是字符串,可以把created字段的mode改成"date",这样Drizzle会自动把数据库的timestamp映射为JavaScript的Date对象:
// 修改后的Schema export const customers = pgTable("customers", { // ...其他字段 created: timestamp({ withTimezone: true, mode: "date" }).defaultNow(), }); // 现在可以直接传入Date对象 const startDate = new Date('2024-01-01'); const endDate = new Date('2024-01-31'); const customers = await db .select() .from(customers) .where(between(customers.created, startDate, endDate));
这种写法更符合JavaScript的习惯,而且同样是类型安全的,Drizzle会自动处理Date对象到数据库timestamp的转换。
为什么之前的写法没生效?
大概率是你传入的startDate/endDate类型和Schema定义的不匹配——比如你传了Date对象,但Schema里是字符串模式,Drizzle的类型检查会阻止这种不匹配的传入(这其实是类型安全的体现!),而不是between()本身不支持日期。
内容来源于stack exchange
相关产品推荐
相关产品推荐

