使用 Prisma 你可以快速把ORM 添加到你的应用中,并对对数据进行建模、运行架构迁移、查询更新数据库。
快速开始
这里使用本地 SQLite 数据库
创建 TypeScript 项目并设置 Prisma ORM
第一步,创建一个项目目录并导航到其中:
mkdir hello-prisma
cd hello-prisma
接下来,使用 npm 初始化 TypeScript 项目:
npm init -y
npm install typescript ts-node @types/node --save-dev
这会创建一个 package.json
,并为你的 TypeScript 应用进行初始设置。
现在,初始化 TypeScript:
npx tsc --init
然后,在项目中安装 Prisma CLI 作为开发依赖:
npm install prisma --save-dev
最后,使用 Prisma CLI 的 init
命令设置 Prisma ORM:
npx prisma init --datasource-provider sqlite
这将创建一个带有 schema.prisma
文件的新 prisma
目录,并将 SQLite 配置为你的数据库。你现在已准备好对数据进行建模并使用一些表创建数据库。
2. 在 Prisma 架构中对数据进行建模
¥ Model your data in the Prisma schema
Prisma 模式提供了一种直观的数据建模方法。将以下模型添加到你的 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 模式中的模型有两个主要用途:
-
代表底层数据库中的表
-
作为生成的 Prisma 客户端 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 客户端 API)。
由于 SQLite 数据库文件之前不存在,因此该命令还在 prisma
目录中创建了它,名称为 dev.db
,通过 .env
文件中的环境变量定义。
恭喜,你现在已准备好数据库和表。让我们来学习如何发送一些查询来读取和写入数据!
4. 探索如何使用 Prisma 客户端将查询发送到数据库
要将查询发送到数据库,你将需要一个 TypeScript 文件来执行 Prisma 客户端查询。为此创建一个名为 script.ts
的新文件:
touch script.ts
然后,将以下样板粘贴到其中:
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
文件中:
script.ts
import { PrismaClient } from '@prisma/client'
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 ts-node script.ts
Show CLI results
{ id: 1, email: 'alice@prisma.io', name: 'Alice' }
干得好,你刚刚使用 Prisma 客户端创建了你的第一个数据库记录!🎉
在下一节中,你将学习如何从数据库读取数据。
4.2.检索所有 User
条记录
Prisma 客户端提供各种查询来从数据库读取数据。在本部分中,你将使用 findMany
查询返回数据库中给定模型的所有记录。
删除之前的 Prisma Client 查询并添加新的 findMany
查询:
script.ts
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 ts-node script.ts
Show CLI results
[{ id: 1, email: 'alice@prisma.io', name: 'Alice' }]
请注意,单个 User
对象现在如何在控制台中用方括号括起来。这是因为 findMany
返回了一个数组,里面有一个对象。
4.3.使用 Prisma 客户端探索关系查询
Prisma 客户端的主要功能之一是易于使用 relations。在本部分中,你将了解如何在嵌套写入查询中创建 User
和 Post
记录。然后,你将看到如何使用 include
选项从数据库中检索关系。
首先,调整脚本以包含嵌套查询:
script.ts
import { PrismaClient } from '@prisma/client'
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 ts-node script.ts
Show CLI results
{ id: 2, email: 'bob@prisma.io', name: 'Bob' }
默认情况下,Prisma 客户端仅返回查询结果对象中的标量字段。这就是为什么,即使你还为新的 User
记录创建了新的 Post
记录,控制台也只打印了一个具有三个标量字段的对象:id
、email
和 name
。
为了还检索属于 User
的 Post
记录,你可以通过 posts
关系字段使用 include
选项:
script.ts
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 ts-node script.ts
Show CLI results
[
{ 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 编译器将防止你意外键入它们。