跳到主要内容

使用 TypeScript 和 Prisma Postgres 查询数据库

使用 Prisma Client 编写您的第一个查询

现在您已经生成了 Prisma Client,您可以开始编写查询来读取和写入数据库中的数据。为了本指南的目的,您将使用一个普通的 TypeScript 脚本来探索 Prisma Client 的一些基本功能。

创建一个名为 queries.ts 的新文件并添加以下代码

queries.ts
// 1
import { PrismaClient } from './generated/prisma'
import { withAccelerate } from '@prisma/extension-accelerate'

// 2
const prisma = new PrismaClient()
.$extends(withAccelerate())

// 3
async function main() {
// ... you will write your Prisma Client queries here
}

// 4
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async (e) => {
console.error(e)
// 5
await prisma.$disconnect()
process.exit(1)
})

以下是代码片段不同部分的快速概览

  1. 导入 PrismaClient 构造函数和 withAccelerate 扩展。
  2. 实例化 PrismaClient 并添加 Accelerate 扩展。
  3. 定义一个名为 mainasync 函数,用于向数据库发送查询。
  4. 调用 main 函数。
  5. 脚本终止时关闭数据库连接。

main 函数内部,添加以下查询以从数据库中读取所有 User 记录并记录结果

queries.ts
async function main() {
const allUsers = await prisma.user.findMany()
console.log(allUsers)
}

现在使用此命令运行代码

npx tsx queries.ts

这应该会打印一个空数组,因为数据库中还没有 User 记录

[]

将数据写入数据库

您在上一节中使用的 findMany 查询仅从数据库中“读取”数据(尽管它仍然是空的)。

在本节中,您将学习如何编写查询以一次性将新记录“写入”到 PostUserProfile 表中。

调整 main 函数,删除之前的代码并添加以下内容

queries.ts
async function main() {
await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: { title: 'Hello World' },
},
profile: {
create: { bio: 'I like turtles' },
},
},
})

const allUsers = await prisma.user.findMany({
include: {
posts: true,
profile: true,
},
})
console.dir(allUsers, { depth: null })
}

此代码使用嵌套写入查询创建新的 User 记录以及新的 PostProfile 记录。

这些记录通过您在 Prisma schema 中定义的关系字段连接起来。

请注意,您还将 include 选项传递给 findMany,它告诉 Prisma Client 将 postsprofile 关系包含在返回的 User 对象上。

使用此命令运行代码

npx tsx queries.ts

输出应类似于此

[
{
email: 'alice@prisma.io',
id: 1,
name: 'Alice',
posts: [
{
content: null,
createdAt: 2020-03-21T16:45:01.246Z,
updatedAt: 2020-03-21T16:45:01.246Z,
id: 1,
published: false,
title: 'Hello World',
authorId: 1,
}
],
profile: {
bio: 'I like turtles',
id: 1,
userId: 1,
}
}
]

另请注意,由于 Prisma Client 生成的类型allUsers 变量是“静态类型”的。您可以通过在编辑器中将鼠标悬停在 allUsers 变量上来观察其类型。它的类型应如下所示

const allUsers: ({
posts: {
id: number;
createdAt: Date;
updatedAt: Date;
title: string;
content: string | null;
published: boolean;
authorId: number;
}[];
profile: {
id: number;
bio: string | null;
userId: number;
} | null;
} & {
...;
})[]
展开以查看已创建记录的视觉视图

查询向 UserPostProfile 表添加了新记录

User

idemailname
1"alice@prisma.io""Alice"

Post

idcreatedAtupdatedAttitlecontentpublishedauthorId
12020-03-21T16:45:01.246Z2020-03-21T16:45:01.246Z"Hello World"nullfalse1

Profile

idbiouserId
1"I like turtles"1

Post 表中的 authorId 列和 Profile 表中的 userId 列中的数字都引用了 User 表的 id 列,这意味着 id1 列因此指的是数据库中第一条(也是唯一一条)User 记录。

在继续下一节之前,您将使用 update 查询“发布”您刚刚创建的 Post 记录。如下调整 main 函数

queries.ts
async function main() {
const post = await prisma.post.update({
where: { id: 1 },
data: { published: true },
})
console.log(post)
}

现在使用与之前相同的命令运行代码

npx tsx queries.ts

您将看到以下输出

{
id: 1,
title: 'Hello World',
content: null,
published: true,
authorId: 1
}

ID 为 1Post 记录现在已在数据库中更新

Post

idtitlecontentpublishedauthorId
1"Hello World"nulltrue1

恭喜!您现在已经学会了如何在应用程序中使用 Prisma Client 查询 Prisma Postgres 数据库。如果您在此过程中迷失方向,想了解更多查询或探索 Prisma Accelerate 的缓存功能,请查看全面的 Prisma 入门模板

© . All rights reserved.