快速入门
在本快速入门指南中,您将学习如何使用一个简单的 TypeScript 项目和一个本地 SQLite 数据库文件,从头开始使用 Prisma ORM。 它涵盖了 数据建模、迁移 和 查询 数据库。
如果您想将 Prisma ORM 与您自己的 PostgreSQL、MySQL、MongoDB 或任何其他支持的数据库一起使用,请改为转到这里
先决条件
本指南需要 Node.js v16.13.0 或更高版本(了解有关 系统要求 的更多信息)。
1. 创建 TypeScript 项目并设置 Prisma ORM
第一步,创建一个项目目录并导航到该目录
mkdir hello-prisma
cd hello-prisma
接下来,使用 npm 初始化一个 TypeScript 项目
npm init -y
npm install typescript tsx @types/node --save-dev
这将创建一个 package.json
,其中包含您 TypeScript 应用程序的初始设置。
请参阅 安装说明,了解如何使用不同的包管理器安装 Prisma。
现在,初始化 TypeScript
npx tsc --init
然后,将 Prisma CLI 作为开发依赖项安装到项目中
npm install prisma --save-dev
最后,使用 Prisma CLI 的 init
命令设置 Prisma ORM
npx prisma init --datasource-provider sqlite
这将创建一个新的 prisma
目录,其中包含一个 schema.prisma
文件,并将 SQLite 配置为您的数据库。 现在,您可以开始建模您的数据并使用一些表创建您的数据库。
2. 在 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 模式中的模型有两个主要目的
- 表示底层数据库中的表
- 作为生成的 Prisma Client API 的基础
在下一节中,您将使用 Prisma Migrate 将这些模型映射到数据库表。
3. 使用 Prisma Migrate 运行迁移以创建您的数据库表
此时,您有一个 Prisma 模式,但还没有数据库。 在您的终端中运行以下命令以创建 SQLite 数据库以及模型表示的 User
和 Post
表
npx prisma migrate dev --name init
该命令执行了三项操作
- 它在
prisma/migrations
目录中为这次迁移创建了一个新的 SQL 迁移文件。 - 它针对数据库执行了 SQL 迁移文件。
- 它在后台运行了
prisma generate
(这将安装@prisma/client
包并根据您的模型生成一个定制的 Prisma Client API)。
由于 SQLite 数据库文件之前不存在,因此该命令还在 prisma
目录中创建了它,文件名是 dev.db
,如 .env
文件中的环境变量所定义。
恭喜您,您的数据库和表现在已准备就绪。 让我们来学习如何发送一些查询来读写数据!
4. 探索如何使用 Prisma Client 发送查询到您的数据库
要将查询发送到数据库,您需要一个 TypeScript 文件来执行 Prisma Client 查询。 为此目的,创建一个名为 script.ts
的新文件
touch script.ts
然后,将以下样板代码粘贴到其中
import { PrismaClient } from '@prisma/client'
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
文件中
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: '[email protected]',
},
})
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
{ id: 1, email: '[email protected]', name: 'Alice' }
干得好,您刚刚使用 Prisma Client 创建了您的第一个数据库记录! 🎉
在下一节中,您将学习如何从数据库中读取数据。
4.2. 检索所有 User
记录
Prisma Client 提供了各种查询来从您的数据库中读取数据。 在本节中,您将使用 findMany
查询,该查询返回给定模型的数据库中的 所有 记录。
删除之前的 Prisma Client 查询,并改为添加新的 findMany
查询
import { PrismaClient } from '@prisma/client'
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
[{ id: 1, email: '[email protected]', name: 'Alice' }]
请注意,现在控制台中的单个 User
对象是如何用方括号括起来的。 这是因为 findMany
返回了一个包含单个对象的数组。
4.3. 探索使用 Prisma Client 的关系查询
Prisma Client 的主要功能之一是轻松处理 关系。 在本节中,您将学习如何在嵌套写入查询中创建 User
和 Post
记录。 之后,您将了解如何使用 include
选项从数据库中检索关系。
首先,调整您的脚本以包含嵌套查询
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const user = await prisma.user.create({
data: {
name: 'Bob',
email: '[email protected]',
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
{ id: 2, email: '[email protected]', name: 'Bob' }
默认情况下,Prisma Client 只在查询的结果对象中返回 标量 字段。 这就是为什么即使您还为新 User
记录创建了一个新的 Post
记录,控制台只打印了一个包含三个标量字段的对象:id
、email
和 name
。
为了检索也属于 User
的 Post
记录,您可以通过 posts
关系字段使用 include
选项
import { PrismaClient } from '@prisma/client'
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
[
{ id: 1, email: '[email protected]', name: 'Alice', posts: [] },
{
id: 2,
email: '[email protected]',
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
查询中包含过滤、排序和分页选项,或探索更多操作,例如 update
和 delete
查询。
在 Prisma Studio 中探索数据
Prisma ORM 带有一个内置的 GUI,用于查看和编辑您数据库中的数据。 您可以使用以下命令打开它
npx prisma studio
使用您自己的数据库设置 Prisma ORM
如果您想使用您自己的 PostgreSQL、MySQL、MongoDB 或任何其他支持的数据库继续使用 Prisma ORM,请遵循设置 Prisma ORM 指南
使用 Prisma Optimize 获取查询洞察和分析
Prisma Optimize 可帮助您生成洞察并提供建议,以帮助您加快数据库查询的速度。
Optimize 旨在帮助各级开发人员编写高效的数据库查询,减少数据库负载并使应用程序更具响应能力。
探索可立即运行的 Prisma ORM 示例
查看 prisma-examples
GitHub 上的仓库,了解如何将 Prisma ORM 与您最喜欢的库一起使用。该仓库包含使用 Express、NestJS、GraphQL 的示例,以及使用 Next.js 和 Vue.js 的全栈示例,以及更多其他内容。
使用 Prisma Pulse 构建实时应用程序
Prisma Pulse 使您能够创建能够即时对数据库中的更改做出反应的应用程序,使您能够轻松构建类型安全实时功能和应用程序。
演示 | 描述 |
---|---|
入门 | 一个 Prisma Pulse 入门应用程序 |
email-with-resend | 一个使用 Prisma Pulse 和 Resend 向新用户发送电子邮件的示例应用程序 |
fullstack-leaderboard | 一个实时排行榜(使用 Next.js 构建) |
fullstack-simple-chat | 一个简单的聊天应用程序(使用 Next.js & Express 构建) |
product-search-with-typesense | 一个将数据同步到 Typesense 的 cron 作业(使用 Hono.js 构建) |
data-sync-with-bigquery | 一个自动将数据同步到 Google BigQuery 的脚本 |
使用 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 拥有庞大的 开发人员社区。加入我们 Discord 或使用 GitHub Discussions 提出问题。