Drizzle-ORM如何向父表与子表中插入数据?
向父表和子表插入数据的正确姿势(Drizzle-ORM)
你的写法逻辑方向是对的,但有几个细节问题必须修正,而且必须用事务来保证数据一致性,视图在这里完全用不上。
先修正你代码里的错误
- 类型不匹配问题:
tokens表的userId字段定义成了text类型,但users表的id是serial(对应PostgreSQL的integer类型),类型不兼容会导致插入失败,应该改成integer("userId")token字段你写了string("token"),但导入的是text类型工具,应该改成text("token")
- 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
相关产品推荐
相关产品推荐

