Drizzle ORM类型安全JSON更新报错:格式错误的数组字面量
Drizzle ORM更新JSON数组报错的解决方法
问题根因
你定义的HistoricalData是类型安全的JSON数组,但直接把history变量传入set方法时,Drizzle没正确将其序列化为数据库可识别的JSON格式,反而把它当作字符串字面量传递,导致数据库解析时抛出格式错误。
可行解决方案
1. 用sql.json()包裹数组
借助Drizzle内置的sql.json()工具处理JSON数据,确保序列化逻辑正确:
import { sql } from 'drizzle-orm'; const id = await db .update(myTable) .set({ Date: sql`now()`, HistoricalData: sql.json(history) // 关键:用sql.json()包裹数组变量 }) .where(eq(myTable.myid, myid)) .returning({ id: myTable.myid }); return json(id);
2. 手动序列化后用sql.raw传递
如果sql.json()不生效,可手动将数组转为JSON字符串,再用sql.raw直接传递给数据库:
const id = await db .update(myTable) .set({ Date: sql`now()`, HistoricalData: sql.raw(`'${JSON.stringify(history)}'`) }) .where(eq(myTable.myid, myid)) .returning({ id: myTable.myid }); return json(id);
3. 校验类型定义一致性
确保historyData接口的字段结构、类型和数据库JSON字段的预期完全匹配,比如字段名大小写、数据类型(比如Value1是字符串还是数字),避免因类型不匹配引发序列化异常:
interface historyData { Date: string; Value1: string; // 根据数据库实际存储类型调整,比如number Value2: string; }
内容的提问来源于stack exchange,提问作者Oliver Gewohn
相关产品推荐
相关产品推荐

