SQLite 快速入门
在本快速入门指南中,您将学习如何使用一个纯 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
这会创建一个 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 --output ../generated/prisma
这会创建一个新的 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 向数据库发送查询
要开始使用 Prisma Client,您需要安装 @prisma/client
包
npm install @prisma/client
安装命令会为您调用 prisma generate
,它会读取您的 Prisma 模式并生成一个根据您的模型量身定制的 Prisma Client 版本。
要向数据库发送查询,您需要一个 TypeScript 文件来执行您的 Prisma Client 查询。为此目的创建一个名为 script.ts
的新文件
touch 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
文件中
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+空格 键来主动调用自动补全。
接下来,使用以下命令执行脚本
npx tsx script.ts
{ id: 1, email: 'alice@prisma.io', name: 'Alice' }
太棒了,您刚刚使用 Prisma Client 创建了第一个数据库记录!🎉
在下一节中,您将学习如何从数据库读取数据。
4.2. 检索所有 User
记录
Prisma Client 提供了各种查询来从数据库读取数据。在本节中,您将使用 findMany
查询,它会返回给定模型在数据库中的所有记录。
删除先前的 Prisma Client 查询,转而添加新的 findMany
查询
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
[{ id: 1, email: 'alice@prisma.io', name: 'Alice' }]
请注意,现在控制台中单个 User
对象被方括号括起来。这是因为 findMany
返回了一个包含单个对象的数组。
4.3. 探索 Prisma Client 中的关系查询
Prisma Client 的主要功能之一是易于处理 关系。在本节中,您将学习如何在嵌套写入查询中创建 User
和 Post
记录。之后,您将了解如何使用 include
选项从数据库中检索关系。
首先,调整您的脚本以包含嵌套查询
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
{ id: 2, email: 'bob@prisma.io', name: 'Bob' }
默认情况下,Prisma Client 在查询结果对象中只返回标量字段。这就是为什么即使您为新的 User
记录创建了一个新的 Post
记录,控制台也只打印了一个包含三个标量字段的对象:id
、email
和 name
。
为了也检索属于 User
的 Post
记录,您可以通过 posts
关系字段使用 include
选项
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
[
{ 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
查询中包含过滤、排序和分页选项,或者探索更多操作,如 update
和 delete
查询。
在 Prisma Studio 中探索数据
Prisma ORM 带有一个内置的图形用户界面(GUI),用于查看和编辑数据库中的数据。您可以使用以下命令打开它
npx prisma studio
使用您自己的数据库设置 Prisma ORM
如果您想继续使用 Prisma ORM,并使用您自己的 PostgreSQL、MySQL、MongoDB 或任何其他受支持的数据库,请遵循设置 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 的全面教程,请查看我们的最新教程
- 使用 Next.js 构建全栈应用
- 使用 Remix 构建全栈应用 (5 部分,包含视频)
- 使用 NestJS 构建 REST API
与 Prisma 保持联系
通过以下方式继续您的 Prisma 之旅 我们活跃的社区。保持了解、积极参与并与其他开发人员协作
- 在 X 上关注我们 获取公告、实时活动和实用提示。
- 加入我们的 Discord 提问、与社区交流,并通过对话获得积极支持。
- 订阅 YouTube 观看教程、演示和直播。
- 在 GitHub 上互动 通过为仓库点赞、报告问题或为问题做出贡献。