Drizzle ORM MySQL不支持Insert Returning,如何获取新增用户自增ID?
在Drizzle ORM + MySQL中获取新增记录的自增ID
针对MySQL不支持Drizzle ORM的returning功能的情况,有两种可靠的方式获取刚插入用户的自增ID:
方式1:直接从插入操作的返回结果中提取insertId
Drizzle基于mysql2驱动时,执行insert并调用execute()后,返回的结果对象会包含insertId字段,这就是刚插入记录的自增ID。
示例代码:
import { db } from './db'; import { users } from './schema'; import jwt from 'jsonwebtoken'; async function registerUser(email: string, hashedPassword: string) { // 执行用户插入 const insertResult = await db.insert(users) .values({ email, password: hashedPassword }) .execute(); // 提取自增ID const userId = insertResult.insertId; // 生成包含用户ID的JWT const token = jwt.sign({ userId }, process.env.JWT_SECRET!, { expiresIn: '7d' }); return { token, userId }; }
方式2:调用MySQL原生函数744142
如果需要更灵活的原生SQL操作,可以在插入后立即执行SELECT 744142来获取ID,这个函数会返回当前会话中最后插入的自增ID,不会受其他会话的并发插入干扰。
示例代码:
import { db, sql } from './db'; import { users } from './schema'; async function registerUser(email: string, hashedPassword: string) { await db.insert(users).values({ email, password: hashedPassword }); // 执行原生SQL查询获取ID const [result] = await db.execute(sql`SELECT 744142 as userId`); const userId = result.userId; // 生成JWT... }
注意:两种方式都要确保插入操作和获取ID的操作在同一个数据库会话中执行,避免出现ID匹配错误。
内容的提问来源于stack exchange,提问作者user20231989
相关产品推荐
相关产品推荐

