跳至主要内容

来自 CLI

本页面提供了在使用 prisma init --db 设置 Prisma Postgres 后,进行操作的分步指南。

  1. 使用 Prisma ORM 设置 TypeScript 应用程序
  2. 迁移数据库的 Schema
  3. 从 TypeScript 查询数据库

先决条件

本指南假设您已使用 prisma init --db 设置了 Prisma Postgres 实例

npx prisma@latest init --db
显示CLI结果

此命令执行完毕后

  • 您已登录到 Prisma Data Platform。
  • 一个新的 Prisma Postgres 实例已创建。
  • prisma/ 文件夹已创建,其中包含一个空的 schema.prisma 文件。
  • DATABASE_URL 环境变量已在 .env 文件中设置。
  • prisma.config.ts 文件已创建,其中包含默认配置。

1. 组织您的项目目录

注意

如果您在希望项目所在的文件夹中运行了 prisma init --db 命令,则可以跳过此步骤并继续下一节

如果您在预期项目目录之外(例如,在您的主文件夹或其他位置)运行了该命令,则需要将生成的 prisma 文件夹和 .env 文件移动到专用的项目目录中。

创建一个新文件夹(例如 hello-prisma),作为您的项目目录,并将必要的文件移入其中。

mkdir hello-prisma
mv .env ./hello-prisma/
mv prisma ./hello-prisma/

导航到您的项目文件夹

cd ./hello-prisma

现在您的项目已位于正确的位置,请继续设置。

2. 设置您的项目

2.1. 设置 TypeScript

初始化一个 TypeScript 项目并添加 Prisma CLI 作为开发依赖项

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

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

接下来,使用项目中的 tsconfig.json 文件初始化 TypeScript

npx tsc --init

2.2. 配置 ESM 支持

更新 tsconfig.json 以兼容 ESM

tsconfig.json
{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "node",
"target": "ES2023",
"strict": true,
"esModuleInterop": true,
"ignoreDeprecations": "6.0"
}
}

更新 package.json 以启用 ESM

package.json
{
"type": "module",
}

2.3. 设置 Prisma ORM

安装使用 Prisma Postgres 所需的依赖项

npm install prisma --save-dev
npm install @prisma/client @prisma/adapter-pg pg dotenv

每个包的作用如下

  • prisma - 用于运行 prisma migrateprisma generate 等命令的 Prisma CLI
  • @prisma/client - 用于查询数据库的 Prisma Client 库
  • @prisma/adapter-pg - 将 Prisma Client 连接到数据库的 node-postgres 驱动程序适配器
  • pg - node-postgres 数据库驱动程序
  • @types/pg - node-postgres 的 TypeScript 类型定义
  • dotenv - 从您的 .env 文件加载环境变量

2.4. 检查生成的 prisma.config.ts

prisma init --db 命令会自动创建一个类似这样的 prisma.config.ts 文件

prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'

export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
})

2.5. 创建一个查询数据库的脚本

在根目录中创建一个 index.ts 文件,这将用于使用 Prisma ORM 查询您的应用程序

touch index.ts

3. 迁移数据库 schema

更新您的 prisma/schema.prisma 文件以包含 UserPost 模型

prisma/schema.prisma
generator client {
provider = "prisma-client"
output = "../generated/prisma"
}

datasource db {
provider = "postgresql"
}

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 Migrate 迁移您的数据库

npx prisma migrate dev --name init

此命令根据您的模式创建数据库表。

现在运行以下命令生成 Prisma Client

npx prisma generate

4. 使用 Prisma ORM 发送查询

4.1. 实例化 Prisma Client

创建一个 lib/prisma.ts 文件,用于实例化带有驱动程序适配器的 Prisma Client

lib/prisma.ts
import "dotenv/config";
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '../generated/prisma/client'

const connectionString = `${process.env.DATABASE_URL}`

const adapter = new PrismaPg({ connectionString })
const prisma = new PrismaClient({ adapter })

export { prisma }
提示

如果需要通过 HTTP 从边缘运行时(Cloudflare Workers、Vercel Edge Functions 等)查询数据库,请使用 Prisma Postgres 无服务器驱动程序

4.2. 编写您的第一个查询

将以下样板代码粘贴到 index.ts

index.ts
import { prisma } from './lib/prisma'

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

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

此代码包含一个在脚本末尾调用的 main 函数。它还实例化了 PrismaClient,您将使用它向数据库发送查询。

4.3. 创建新的 User 记录

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

index.ts
import { prisma } from './lib/prisma'

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)
})

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

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

干得好,您刚刚使用 Prisma Postgres 创建了您的第一个数据库记录! 🎉

4.4. 检索所有 User 记录

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

删除之前的 Prisma ORM 查询,并添加新的 findMany 查询

index.ts
import { prisma } from './lib/prisma'

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 index.ts
显示CLI结果
[{ id: 1, email: 'alice@prisma.io', name: 'Alice' }]

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

4.5. 探索关系查询

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

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

index.ts
import { prisma } from './lib/prisma'

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 index.ts
显示CLI结果
{ id: 2, email: 'bob@prisma.io', name: 'Bob' }

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

index.ts
import { prisma } from './lib/prisma'

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 index.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 记录。

后续步骤

您刚刚完成了 Prisma Postgres 的基本设置。如果您想探索更复杂的查询,例如添加缓存功能,请查看官方快速入门

在 Prisma Studio 中查看和编辑数据

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

npx prisma studio --config ./prisma.config.ts

使用 Prisma Postgres,您还可以直接在通过选择项目中的 Studio 选项卡。

使用 Next.js 构建全栈应用程序

了解如何在全栈应用中使用 Prisma Postgres

探索现成示例

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

这些示例默认使用 SQLite,但您可以按照项目 README 中的说明,通过几个简单的步骤切换到 Prisma Postgres。


与 Prisma 保持联系

通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

© . This site is unofficial and not affiliated with Prisma Data, Inc.