在Drizzle ORM中获取插入行的完整字段数据

在Drizzle ORM中获取插入行的完整字段数据

til :memo: Today I Learned til 项目地址: https://gitcode.com/gh_mirrors/ti/til

引言

在现代应用开发中,数据库操作是核心环节之一。当我们向数据库插入新记录时,有时不仅需要确认操作成功,还需要获取数据库生成或计算的值。本文将深入探讨如何使用Drizzle ORM高效地获取插入行的完整字段数据。

基础插入操作

在Drizzle ORM中,最基本的插入操作如下:

await db
  .insert(todoItems)
  .values({
    title,
    userId,
    description,
  })

这种操作返回的是QueryResult<never>类型,意味着我们无法从数据库获取任何有用的返回信息。对于简单的插入操作,这可能已经足够,但在许多实际场景中,我们需要更多信息。

为什么需要返回插入数据

数据库通常会为插入的行生成或计算某些值,例如:

  1. 自增ID(来自序列)
  2. 默认值为当前时间的时间戳列
  3. 计算生成的列
  4. 触发器修改的值

如果我们不主动获取这些值,客户端将无法知道数据库最终存储了什么内容,这可能导致后续操作出现问题。

获取完整插入行数据

Drizzle ORM提供了returning()方法,可以获取插入行的所有字段:

const insertedRows = await db
  .insert(todoItems)
  .values({
    title,
    userId,
    description,
  })
  .returning()

这种方法会返回Array<type todoItems>类型的结果,其中包含所有插入行的完整数据。对于单行插入,结果数组将只包含一个元素。

选择性返回特定字段

有时我们只需要部分字段(如自增ID),可以使用部分返回语法:

const result = await db
  .insert(todoItems)
  .values({
    title,
    userId,
    description,
  })
  .returning({ id: todoItems.id })

这种方式在只需要特定字段时更加高效,减少了不必要的数据传输。

实际应用场景

  1. 关联操作:插入主表记录后立即获取ID用于插入关联表
  2. 审计日志:获取数据库生成的时间戳用于记录操作时间
  3. 数据验证:确认数据库最终存储的值与预期一致
  4. 乐观UI更新:在前端立即显示完整的插入数据而无需额外查询

性能考虑

虽然returning()功能强大,但也需要考虑性能影响:

  1. 网络传输:返回完整行数据会增加响应大小
  2. 数据库负载:某些数据库实现中,返回数据需要额外处理
  3. 在批量插入时,返回大量数据可能影响性能

因此,在不需要完整数据时,建议使用选择性返回。

总结

Drizzle ORM的returning()方法为开发者提供了灵活获取插入数据的能力。无论是需要完整行数据还是特定字段,都能通过简洁的API实现。合理使用这一功能可以简化代码逻辑,提高应用的数据一致性。

在实际开发中,应根据具体需求选择适当的返回策略,平衡功能需求和性能考虑。

til :memo: Today I Learned til 项目地址: https://gitcode.com/gh_mirrors/ti/til

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水珊习Gale

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值