Post cover

Prisma Client 语法示例

Author AvatarYuhang
2024年7月27日
JavaScriptTypeScript

基本示例

1. 定义数据模型:

PRISMA
1generator client { 2 provider = "prisma-client-js" 3} 4 5datasource db { 6 provider = "postgresql" 7 url = env("DATABASE_URL") 8} 9 10model User { 11 id Int @id @default(autoincrement()) 12 email String @unique 13 name String? 14 createdAt DateTime @default(now()) 15 updatedAt DateTime @updatedAt 16 posts Post[] 17} 18 19model Post { 20 id Int @id @default(autoincrement()) 21 title String 22 content String? 23 published Boolean @default(false) 24 author User @relation(fields: [authorId], references: [id]) 25 authorId Int 26}
  • 数据类型: Int, String, Boolean, DateTime
  • 字段修饰符: @id, @unique, @default, @updatedAt, @relation
  • 关系字段关键字: fields, references

2. 创建记录:

TS
1import { PrismaClient } from '@prisma/client' 2 3const prisma = new PrismaClient() 4 5async function main() { 6 const user = await prisma.user.create({ 7 data: { 8 email: 'alice@example.com', 9 name: 'Alice', 10 posts: { 11 create: { 12 title: 'Hello World', 13 content: 'My first post!', 14 }, 15 }, 16 }, 17 }) 18 console.log(user) 19} 20 21main() 22 .catch((e) => { 23 throw e 24 }) 25 .finally(async () => { 26 await prisma.$disconnect() 27 })
  • 使用 prisma.user.create() 方法创建 User 记录。
  • 使用 create 嵌套对象创建关联的 Post 记录。

3. 查询记录:

TS
1// ... 2 3async function main() { 4 // 获取所有用户 5 const allUsers = await prisma.user.findMany() 6 7 // 获取特定用户及其帖子 8 const userWithPosts = await prisma.user.findUnique({ 9 where: { email: 'alice@example.com' }, 10 include: { posts: true }, 11 }) 12 13 console.log(allUsers, userWithPosts) 14} 15 16// ...
  • 使用 prisma.user.findMany() 方法获取所有 User 记录。
  • 使用 prisma.user.findUnique() 方法获取特定 User 记录。
  • 使用 include 选项加载关联的 Post 记录。

4. 更新记录:

TS
1// ... 2 3async function main() { 4 // 更新用户名称 5 const updatedUser = await prisma.user.update({ 6 where: { email: 'alice@example.com' }, 7 data: { name: 'Alice Lee' }, 8 }) 9 10 console.log(updatedUser) 11} 12 13// ...
  • 使用 prisma.user.update() 方法更新 User 记录。
  • 使用 where 选项指定要更新的记录。
  • 使用 data 选项设置要更新的字段值。

5. 删除记录:

TS
1// ... 2 3async function main() { 4 // 删除特定用户 5 const deletedUser = await prisma.user.delete({ 6 where: { email: 'alice@example.com' }, 7 }) 8 9 console.log(deletedUser) 10} 11 12// ...
  • 使用 prisma.user.delete() 方法删除 User 记录。
  • 使用 where 选项指定要删除的记录。

多表查询

1. 一对多关系查询 (User -> Posts):

TS
1// 获取单个用户及其所有帖子 2const userWithPosts = await prisma.user.findUnique({ 3 where: { id: 1 }, 4 include: { posts: true }, 5}); 6 7// 获取所有用户及其帖子 8const allUsersWithPosts = await prisma.user.findMany({ 9 include: { posts: true }, 10});

2. 反向一对多关系查询 (Post -> Author):

TS
1// 获取单个帖子及其作者信息 2const postWithAuthor = await prisma.post.findUnique({ 3 where: { id: 1 }, 4 include: { author: true }, 5}); 6 7// 获取所有已发布帖子及其作者信息 8const publishedPostsWithAuthors = await prisma.post.findMany({ 9 where: { published: true }, 10 include: { author: true }, 11});

3. 嵌套查询:

TS
1// 获取发布了帖子的用户,并包含帖子信息 2const usersWithPublishedPosts = await prisma.user.findMany({ 3 where: { 4 posts: { 5 some: { published: true }, 6 }, 7 }, 8 include: { 9 posts: true, 10 }, 11});

4. 分页:

TS
1// 获取第一页的用户及其帖子 (每页 10 个用户) 2const firstPageUsersWithPosts = await prisma.user.findMany({ 3 include: { posts: true }, 4 take: 10, 5 skip: 0, 6}); 7 8// 获取第二页的用户及其帖子 9const secondPageUsersWithPosts = await prisma.user.findMany({ 10 include: { posts: true }, 11 take: 10, 12 skip: 10, 13});

5. 排序:

TS
1// 按创建时间降序获取帖子及其作者 2const postsSortedByDate = await prisma.post.findMany({ 3 include: { author: true }, 4 orderBy: { createdAt: "desc" }, 5});
0

Likes

加载评论中...