跳到主要内容

快速入门

在本快速入门指南中,您将学习如何使用纯 TypeScript 项目和本地 SQLite 数据库文件从零开始使用 Prisma ORM。它涵盖了数据建模迁移和数据库查询

如果您想使用 Prisma ORM 连接您自己的 PostgreSQL、MySQL、MongoDB 或任何其他受支持的数据库,请改为前往此处

先决条件

您的机器需要安装 Node.js(请参阅系统要求以了解官方支持的版本)。

1. 创建 TypeScript 项目并设置 Prisma ORM

第一步,创建一个项目目录并进入该目录

mkdir hello-prisma
cd hello-prisma

接下来,使用 npm 初始化一个 TypeScript 项目

npm init -y
npm install typescript tsx @types/node --save-dev

这将创建一个包含 TypeScript 应用初始设置的 package.json 文件。

信息

请参阅 安装说明,了解如何使用不同的包管理器安装 Prisma。

现在,初始化 TypeScript

npx tsc --init

然后,在项目中将 Prisma CLI 安装为开发依赖

npm install prisma --save-dev

最后,使用 Prisma CLI 的 init 命令设置 Prisma ORM

npx prisma init --datasource-provider sqlite --output ../generated/prisma

这会创建一个新的 prisma 目录,其中包含一个 schema.prisma 文件,并将 SQLite 配置为您的数据库。您现在可以建模数据并创建带有一些表的数据库了。

注意

为了获得最佳结果,请确保在您的 .gitignore 文件中添加一行,以排除生成的客户端代码。在此示例中,我们希望排除 generated/prisma 目录。

.gitignore
generated/prisma/

2. 在 Prisma schema 中建模数据

Prisma schema 提供了一种直观的数据建模方式。将以下模型添加到您的 schema.prisma 文件中

prisma/schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}

model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}

Prisma schema 中的模型有两个主要用途

  • 表示底层数据库中的表
  • 作为生成的 Prisma Client API 的基础

在下一节中,您将使用 Prisma Migrate 将这些模型映射到数据库表。

3. 运行迁移以使用 Prisma Migrate 创建数据库表

至此,您已经有了 Prisma schema,但还没有数据库。在终端中运行以下命令来创建 SQLite 数据库以及由您的模型表示的 UserPost

npx prisma migrate dev --name init

这个命令做了三件事

  1. 它在 prisma/migrations 目录中为本次迁移创建了一个新的 SQL 迁移文件。
  2. 它针对数据库执行了 SQL 迁移文件。
  3. 它在底层运行了 prisma generate(它安装了 @prisma/client 包并根据您的模型生成了定制的 Prisma Client API)。

由于 SQLite 数据库文件之前不存在,该命令还在 prisma 目录中创建了它,名称为 dev.db,这在 .env 文件中通过环境变量定义。

恭喜,您现在已经准备好数据库和表了。接下来我们学习如何发送一些查询来读写数据!

4. 探索如何使用 Prisma Client 向数据库发送查询

要开始使用 Prisma Client,您需要安装 @prisma/client

npm install @prisma/client

安装命令会为您调用 prisma generate,它会读取您的 Prisma schema 并生成一个根据您的模型定制的 Prisma Client 版本。

要向数据库发送查询,您将需要一个 TypeScript 文件来执行您的 Prisma Client 查询。为此创建一个名为 script.ts 的新文件

touch script.ts

然后,将以下样板代码粘贴到其中

script.ts
import { PrismaClient } from '../generated/prisma'

const prisma = new PrismaClient()

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

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

此代码包含一个 main 函数,该函数在脚本末尾调用。它还实例化了 PrismaClient,该对象代表了您数据库的查询接口。

4.1. 创建新的 User 记录

让我们从一个简单的查询开始,在数据库中创建一个新的 User 记录,并将结果对象记录到控制台。将以下代码添加到您的 script.ts 文件中

script.ts
import { PrismaClient } from '../generated/prisma'

const prisma = new PrismaClient()

async function main() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
},
})
console.log(user)
}

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

您可以在编辑器中手动输入代码,而不是复制,以体验 Prisma Client 提供的自动补全功能。您也可以通过按键盘上的 CTRL+SPACE 键主动调用自动补全。

接下来,使用以下命令执行脚本

npx tsx script.ts
显示CLI结果
{ id: 1, email: 'alice@prisma.io', name: 'Alice' }

太棒了,您刚刚使用 Prisma Client 创建了第一个数据库记录!🎉

在下一节中,您将学习如何从数据库中读取数据。

4.2. 检索所有 User 记录

Prisma Client 提供了各种查询来从数据库中读取数据。在本节中,您将使用 findMany 查询,它会返回给定模型的数据库中的所有记录。

删除之前的 Prisma Client 查询,改为添加新的 findMany 查询

script.ts
import { PrismaClient } from '../generated/prisma'

const prisma = new PrismaClient()

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

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

再次执行脚本

npx tsx script.ts
显示CLI结果
[{ id: 1, email: 'alice@prisma.io', name: 'Alice' }]

注意控制台中单个 User 对象现在被方括号括起来了。这是因为 findMany 返回了一个包含一个对象的数组。

4.3. 使用 Prisma Client 探索关系查询

Prisma Client 的主要特性之一是易于处理关系。在本节中,您将学习如何在嵌套写入查询中创建 UserPost 记录。之后,您将看到如何使用 include 选项从数据库中检索关系。

首先,调整您的脚本以包含嵌套查询

script.ts
import { PrismaClient } from '../generated/prisma'

const prisma = new PrismaClient()

async function main() {
const user = await prisma.user.create({
data: {
name: 'Bob',
email: 'bob@prisma.io',
posts: {
create: [
{
title: 'Hello World',
published: true
},
{
title: 'My second post',
content: 'This is still a draft'
}
],
},
},
})
console.log(user)
}

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

再次执行脚本来运行查询

npx tsx script.ts
显示CLI结果
{ id: 2, email: 'bob@prisma.io', name: 'Bob' }

默认情况下,Prisma Client 在查询结果对象中仅返回标量字段。这就是为什么,即使您为新的 User 记录创建了一个新的 Post 记录,控制台也只打印了一个包含三个标量字段的对象:idemailname

为了同时检索属于某个 UserPost 记录,您可以通过 posts 关系字段使用 include 选项

script.ts
import { PrismaClient } from '../generated/prisma'

const prisma = new PrismaClient()

async function main() {
const usersWithPosts = await prisma.user.findMany({
include: {
posts: true,
},
})
console.dir(usersWithPosts, { depth: null })
}

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

再次运行脚本以查看嵌套读取查询的结果

npx tsx script.ts
显示CLI结果
[
{ id: 1, email: 'alice@prisma.io', name: 'Alice', posts: [] },
{
id: 2,
email: 'bob@prisma.io',
name: 'Bob',
posts: [
{
id: 1,
title: 'Hello World',
content: null,
published: true,
authorId: 2
},
{
id: 2,
title: 'My second post',
content: 'This is still a draft',
published: false,
authorId: 2
}
]
}
]

这次,您看到打印了两个 User 对象。它们都包含一个 posts 字段("Alice" 的该字段为空,而 "Bob" 的该字段填充了两个 Post 对象),该字段代表了与它们关联的 Post 记录。

注意,usersWithPosts 数组中的对象也是完全类型化的。这意味着您将获得自动补全,并且 TypeScript 编译器会防止您意外地输入错误类型。

5. 下一步

在本快速入门指南中,您学习了如何在纯 TypeScript 项目中开始使用 Prisma ORM。您可以自由地自行探索 Prisma Client API,例如,在 findMany 查询中加入过滤、排序和分页选项,或者探索更多操作,如 updatedelete 查询。

在 Prisma Studio 中探索数据

Prisma ORM 内置了一个 GUI,用于查看和编辑数据库中的数据。您可以使用以下命令打开它

npx prisma studio

使用您自己的数据库设置 Prisma ORM

如果您想使用您自己的 PostgreSQL、MySQL、MongoDB 或任何其他受支持的数据库继续使用 Prisma ORM,请遵循设置 Prisma ORM 指南

使用 Prisma Optimize 获取查询洞察和分析

Prisma Optimize 帮助您生成洞察并提供建议,从而帮助您加快数据库查询速度。

Optimize 旨在帮助各种技能水平的开发者编写高效的数据库查询,减少数据库负载并使应用程序响应更快。

探索可直接运行的 Prisma ORM 示例

请查看 GitHub 上的 prisma-examples 仓库,了解如何将 Prisma ORM 与您喜欢的库一起使用。该仓库包含 Express、NestJS、GraphQL 的示例,以及使用 Next.js 和 Vue.js 的全栈示例,还有更多内容。

使用 Prisma Accelerate 加速您的数据库查询

Prisma Accelerate 是一个连接池和全局数据库缓存,可以极大地加速您的数据库查询。查看 速度测试 或尝试将 Accelerate 与您喜欢的框架一起使用

演示描述
nextjs-starter一个使用 Prisma Accelerate 缓存和连接池的 Next.js 项目
svelte-starter一个使用 Prisma Accelerate 缓存和连接池的 SvelteKit 项目
solidstart-starter一个使用 Prisma Accelerate 缓存和连接池的 Solidstart 项目
remix-starter一个使用 Prisma Accelerate 缓存和连接池的 Remix 项目
nuxt-starter一个使用 Prisma Accelerate 缓存和连接池的 Nuxt.js 项目
astro-starter一个使用 Prisma Accelerate 缓存和连接池的 Astro 项目

使用 Prisma ORM 构建应用程序

Prisma 博客提供了关于 Prisma ORM 的详细教程,请查看我们的最新教程


与 Prisma 保持联系

通过以下方式继续您的 Prisma 之旅 我们活跃的社区。随时了解信息,参与其中,并与其他开发者协作

我们非常珍视您的参与,期待您成为我们社区的一员!