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

Drizzle-ORM如何向父表与子表中插入数据?

向父表和子表插入数据的正确姿势(Drizzle-ORM)

你的写法逻辑方向是对的,但有几个细节问题必须修正,而且必须用事务来保证数据一致性,视图在这里完全用不上。

先修正你代码里的错误

  1. 类型不匹配问题:
    • tokens表的userId字段定义成了text类型,但users表的id是serial(对应PostgreSQL的integer类型),类型不兼容会导致插入失败,应该改成integer("userId")
    • token字段你写了string("token"),但导入的是text类型工具,应该改成text("token")
  2. returning()的返回值问题:
    Drizzle-ORM的returning()返回的是数组(哪怕只插入一条数据),所以你不能直接用newUser.id,得取数组第一个元素的id:newUser[0].id

为什么必须用事务?

如果分开执行两次插入,会出现「用户插入成功,但令牌插入失败」的情况,导致数据不一致(存在无令牌的用户)。用事务可以把两个操作绑定在一起:要么全部执行成功,要么全部回滚到初始状态,避免脏数据。

正确的事务写法示例

import { db } from './你的数据库连接文件';
import { users, tokens } from './你的表定义文件';

// 用事务包裹两个插入操作
const createUserWithToken = async () => {
  try {
    const result = await db.transaction(async (tx) => {
      // 插入用户并返回生成的记录
      const newUser = await tx.insert(users).values({ name: "Billy" }).returning();
      // 用用户的id插入令牌
      const newToken = await tx.insert(tokens).values({ 
        userId: newUser[0].id, 
        token: "123" 
      }).returning();
      // 返回最终的用户和令牌数据
      return { user: newUser[0], token: newToken[0] };
    });
    console.log('创建成功:', result);
  } catch (error) {
    console.error('创建失败:', error);
  }
};

createUserWithToken();

关于视图的说明

视图是用来封装查询逻辑的,不能用来插入数据,所以这个场景完全不需要考虑视图。

内容的提问来源于stack exchange,提问作者wongx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:03:20