如何在Drizzle ORM中返回非数据表列的自定义字符串值
如何在Drizzle ORM中返回非数据表列的自定义字符串值
嘿,我完全懂你想要实现的效果——就是像你原来的SQL那样,给不同表的查询结果手动加上一个自定义的type字段,用来区分数据来源,又不用在两个表中实际添加这个冗余列,对吧?
你之前尝试直接写type: 'car'不行,是因为Drizzle会把这个字面量字符串当成要映射到数据表的列名,而不是你想要返回的静态值。要解决这个问题,你需要用Drizzle提供的sql.val()方法(或者sql模板字符串)来明确告诉ORM这是一个要返回的静态SQL表达式。
具体实现步骤
对应你原来的SQL逻辑,我们可以分两步构建查询再合并:
为每个表的查询添加自定义静态字段
用sql.val()来包裹你想要的字符串值,它会自动处理SQL中的字符串转义,更安全:// 构建汽车表的查询,添加type为'car' const carQuery = db.select({ type: sql.val('car'), model: cars.model, }).from(cars); // 构建卡车表的查询,添加type为'truck' const truckQuery = db.select({ type: sql.val('truck'), model: trucks.model, }).from(trucks);合并两个查询(对应SQL中的UNION)
用Drizzle的union()方法把两个查询合并起来:const vehicles = db.union(carQuery, truckQuery);
链式调用的写法
如果你喜欢更紧凑的链式写法,也可以这样写:
const vehicles = db .select({ type: sql.val('car'), model: cars.model, }) .from(cars) .union( db.select({ type: sql.val('truck'), model: trucks.model, }).from(trucks) );
这样执行出来的SQL就和你原来写的完全一致了,返回的结果里会包含type字段,分别对应'car'和'truck',用来区分数据来自哪个表。
备注:内容来源于stack exchange,提问作者Clement
相关产品推荐
相关产品推荐

