You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drizzle ORM中返回非数据表列的自定义字符串值

如何在Drizzle ORM中返回非数据表列的自定义字符串值

嘿,我完全懂你想要实现的效果——就是像你原来的SQL那样,给不同表的查询结果手动加上一个自定义的type字段,用来区分数据来源,又不用在两个表中实际添加这个冗余列,对吧?

你之前尝试直接写type: 'car'不行,是因为Drizzle会把这个字面量字符串当成要映射到数据表的列名,而不是你想要返回的静态值。要解决这个问题,你需要用Drizzle提供的sql.val()方法(或者sql模板字符串)来明确告诉ORM这是一个要返回的静态SQL表达式。

具体实现步骤

对应你原来的SQL逻辑,我们可以分两步构建查询再合并:

  1. 为每个表的查询添加自定义静态字段
    用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);
    
  2. 合并两个查询(对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:03:11