如何在Prisma中为PostgreSQL表的user_id与guild_id设置联合唯一约束并通过TypeScript查询对应数据
我来帮你搞定这两个问题——给user_id和guild_id加联合唯一约束,还有修正TypeScript里的查询代码:
1. 设置联合唯一约束
在Prisma里,单个字段的唯一约束用@unique,而联合唯一约束得用@@unique来定义,把要联合的字段放进数组里就行。你只需要修改schema.prisma模型,加上这条约束:
model users { user_id BigInt guild_id BigInt bans Int kicks Int warns Int // 定义user_id和guild_id的联合唯一约束 @@unique([user_id, guild_id]) }
改完之后记得运行prisma migrate dev,把这个约束同步到PostgreSQL数据库里,这样数据库层面就会保证同一个用户在同一个服务器里只会有一条记录啦。
2. 修正TypeScript查询代码
你原来的查询有个小问题:把字符串"user_id"转成BigInt了,这显然不是你要的实际用户ID和服务器ID值。而且咱们已经加了联合唯一约束,用findUnique比findMany更合适——它会直接返回匹配的单条记录(如果存在的话),效率更高。
下面是修正后的代码示例:
// 假设你从请求参数、上下文或者其他地方拿到实际的ID值 const targetUserId = BigInt("123456789"); // 替换成实际的用户ID(字符串/数值都可以转) const targetGuildId = BigInt("987654321"); // 替换成实际的服务器ID // 使用findUnique查询单条匹配记录 const userRecord = await prisma.users.findUnique({ where: { user_id_guild_id: { // Prisma会自动把联合唯一的字段名用下划线拼接成这个键 user_id: targetUserId, guild_id: targetGuildId } } }); // 如果特殊场景下确实需要用findMany,写法是这样的: // const userRecords = await prisma.users.findMany({ // where: { // user_id: targetUserId, // guild_id: targetGuildId // } // });
需要注意的是,定义联合唯一约束后,Prisma会自动生成一个复合查询键,格式是字段1_字段2,所以findUnique的where里要用到这个键名。要是不确定键名,可以运行prisma generate更新类型,编辑器会给你自动提示。
另外,如果你拿到的ID是字符串类型(比如从前端传过来的),一定要用BigInt()转成正确的类型,不然会和数据库里的BigInt字段不匹配哦。
内容的提问来源于stack exchange,提问作者zel
相关产品推荐
相关产品推荐

