prisma 快速开始
prisma 快速开始
先决条件
使用prisma之前你需要,本文章使用 mysql 数据库进行演示
重头开始构建
初始化prisma
第一步,创建一个项目目录并导入它
mkdir hello-prisma
cd hello-prisma接下来,初始化一个 TypeScript 项目,并将 Prisma CLI 添加到它的开发依赖项中
npm init -y
npm install prisma typescript ts-node @types/node --save-dev这将创建一个 package.json 文件,其中包含您的 TypeScript 应用程序的初始设置。
接下来,初始化 TypeScript
npx tsc --init您现在可以通过在前面加上 npx 来调用 Prisma CLI
npx prisma接下来,通过以下命令创建您的 Prisma 架构 文件,设置您的 Prisma ORM 项目
npx prisma init此命令执行两项操作
- 创建一个名为
prisma的新目录,其中包含一个名为schema.prisma的文件,该文件包含带有数据库连接变量和架构模型的 Prisma 架构 - 在项目的根目录中创建
.env文件,用于定义环境变量(例如您的数据库连接)
连接到数据库
要连接数据库,您需要将 Prisma 架构中 datasource 块的 url 字段设置为数据库的 连接 URL
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}在这种情况下,url 是 通过环境变量设置 的,该变量在 .env 中定义
DATABASE_URL="mysql://root:cosarty123@127.0.0.1:3306/prisma_study"信息
我们建议将 .env 添加到 .gitignore 文件中,以防止提交环境变量
你现在需要调整连接 URL 以指向你自己的数据库。
数据库的 连接 URL 格式 取决于你使用的数据库。对于 PostgreSQL,它如下所示(所有大写部分都是特定连接详细信息的占位符)
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMAUSER:数据库用户的名称PASSWORD:数据库用户的密码HOST:主机名(对于本地环境,它是localhost)PORT:数据库服务器运行的端口(对于 PostgreSQL,通常为5432)DATABASE:数据库 的名称SCHEMA:模式 在数据库中的名称
在 macOS 上本地运行 Mysql 时,你的用户和密码以及数据库名称通常对应于你操作系统的当前用户,例如,假设用户名为 cosarty
DATABASE_URL="mysql://root:cosarty123@127.0.0.1:3306/prisma_study"使用Prisma Migrate
prisma migrate 是一个prisma自带的迁移工具超级方便,后面会详细讲解
在本指南中,您将使用 Prisma Migrate 在数据库中创建表。将以下数据模型添加到 prisma/schema.prisma 中的 Prisma 架构 中
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String @db.VarChar(255)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile Profile?
}要将数据模型映射到数据库架构,您需要使用 prisma migrate CLI 命令
npx prisma migrate dev --name init此命令执行两项操作
- 它为此迁移创建新的 SQL 迁移文件
- 它针对数据库运行 SQL 迁移文件
相关信息
在运行 prisma migrate dev 之后,默认情况下会调用 generate。如果架构中定义了 prisma-client-js 生成器,这将检查是否安装了 @prisma/client,如果缺少,则会安装它。

安装 prisma client
要开始使用 Prisma 客户端,你需要安装 @prisma/client 包
npm install @prisma/client安装命令会为你调用 prisma generate,它会读取你的 Prisma 架构并生成一个针对你的模型进行定制的 Prisma 客户端版本。
每当你更新 Prisma 架构时,你都必须使用 prisma migrate dev 或 prisma db push 来更新数据库架构。这会让你的数据库架构与 Prisma 架构保持同步。这些命令还会重新生成 Prisma 客户端。
查询数据库
使用 Prisma Client 编写第一个查询
生成 Prisma Client 后,就可以开始编写查询来读取和写入数据库中的数据。本指南使用一个简单的 Node.js 脚本来探索 Prisma Client 的一些基本功能。
创建一个名为 index.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)
})以下是代码片段不同部分的快速概述
- 从
@prisma/client节点模块导入PrismaClient构造函数 - 实例化
PrismaClient - 定义一个名为
main的async函数,用于向数据库发送查询 - 调用
main函数 - 在脚本终止时关闭数据库连接
在 main 函数中,添加以下查询以从数据库中读取所有 User 记录并打印结果
index.ts
async function main() {
// ... you will write your Prisma Client queries here
const allUsers = await prisma.user.findMany()
console.log(allUsers)
}现在使用此命令运行代码
npx ts-node index.ts这应该打印一个空数组,因为数据库中还没有 User 记录
[]将数据写入数据库
你在上一节中使用的 findMany 查询仅从数据库中读取数据(尽管它仍然为空)。在本节中,你将学习如何编写查询以将新记录写入Post 和 User 表。
调整 main 函数以向数据库发送 create 查询
async function main() {
await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: { title: 'Hello World' },
},
profile: {
create: { bio: 'I like turtles' },
},
},
})
const allUsers = await prisma.user.findMany({
include: {
posts: true,
profile: true,
},
})
console.dir(allUsers, { depth: null })
}此代码使用嵌套写入查询创建新的 User 记录以及新的 Post 和 Profile 记录。User 记录通过 Post.author ↔ User.posts 和 Profile.user ↔ User.profile 关系字段分别连接到其他两个记录。
请注意,你正在将include选项传递给 findMany,它告诉 Prisma Client 在返回的 User 对象中包括 posts 和 profile 关系。
使用此命令运行代码
npx ts-node index.ts输出应类似于此
[
{
email: 'alice@prisma.io',
id: 1,
name: 'Alice',
posts: [
{
content: null,
createdAt: 2020-03-21T16:45:01.246Z,
updatedAt: 2020-03-21T16:45:01.246Z,
id: 1,
published: false,
title: 'Hello World',
authorId: 1,
}
],
profile: {
bio: 'I like turtles',
id: 1,
userId: 1,
}
}
]另请注意,由于Prisma Client 生成的类型,allUsers 是静态类型的。你可以通过在编辑器中将鼠标悬停在 allUsers 变量上观察类型。它应按如下方式输入
const allUsers: (User & {
posts: Post[]
})[]
export type Post = {
id: number
title: string
content: string | null
published: boolean
authorId: number | null
}该查询向 User 和 Post 表添加了新记录
用户
| id | name | |
|---|---|---|
1 | "alice@prisma.io" | "Alice" |
文章
| id | createdAt | updatedAt | title | content | published | authorId |
|---|---|---|---|---|---|---|
1 | 2020-03-21T16:45:01.246Z | 2020-03-21T16:45:01.246Z | "Hello World" | null | false | 1 |
个人资料
| id | 个人简介 | 用户 ID |
|---|---|---|
1 | “我喜欢乌龟” | 1 |
注意:
Post表中的authorId列和Profile表中的userId列中的数字都引用User表的id列,这意味着id值1列因此引用数据库中的第一个(也是唯一一个)User记录。
在继续下一部分之前,你将使用 update 查询“发布”你刚刚创建的 Post 记录。按如下方式调整 main 函数
async function main() {
const post = await prisma.post.update({
where: { id: 1 },
data: { published: true },
})
console.log(post)
}现在使用与之前相同的命令运行代码
npx ts-node index.ts你将看到以下输出
{
"id": 1,
"title": 'Hello World',
"content": null,
"published": true,
"authorId": 1
}具有 id 为 1 的 Post 记录现在已在数据库中更新
文章
| id | title | content | published | authorId |
|---|---|---|---|---|
1 | "Hello World" | null | true | 1 |
还可以这么查询
const posts = await prisma.profile
.findUnique({
where: { id: 1 },
})
.user()
.posts()添加到现有项目
连接数据库这边就不赘述了,不懂的看上文
introspection
使用 Prisma ORM 内省你的数据库
introspection是prisma内置的一个同步工具,他可以将现有数据库的结构保存到shcema.prisma里面去
运行以下命令以内省你的数据库
npx prisma db pull此命令读取在 .env 中定义的 DATABASE_URL 环境变量并连接到你的数据库。一旦建立连接,它将内省数据库(即读取数据库模式)。然后,它将数据库模式从 SQL 转换为 Prisma 模式中的数据模型。
内省完成后,你的 Prisma 模式文件已更新

Prisma ORM 的数据模型是你数据库模式的声明性表示,并作为生成的 Prisma 客户端库的基础。你的 Prisma 客户端实例将公开针对这些模型定制的查询。
建立数据库基准
创建初始迁移
若要将 Prisma Migrate 与上一部分中自省的数据库结合使用,你需要建立数据库基准。
建立基准是指初始化可能已包含数据且无法重置的数据库(例如生产数据库)的迁移历史记录。建立基准会告知 Prisma Migrate 假设已对数据库应用了一个或多个迁移。
若要建立数据库基准,请使用 prisma migrate diff 比较架构和数据库,并将输出保存到 SQL 文件中。
首先,创建一个 migrations 目录,并在其中添加一个目录,目录名称可以根据需要自定义。在此示例中,我们将使用 0_init 作为迁移名称
mkdir -p prisma/migrations/0_init信息
-p 将递归创建给定路径中所有缺失的文件夹。
接下来,使用 prisma migrate diff 生成迁移文件。使用以下参数
--from-empty:假定要从中迁移的数据模型为空--to-schema-datamodel:使用datasource块中的 URL 的当前数据库状态--script:输出 SQL 脚本
npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script > prisma/migrations/0_init/migration.sql或者 局部同步
npx prisma migrate diff --from-schema-datasource prisma/schema.prisma --to-schema-datamodel prisma/schema.prisma --script > prisma/sql/diff.sql查看迁移
该命令将生成一个迁移,它应类似于以下脚本
-- CreateTable
CREATE TABLE "Post" (
"id" SERIAL NOT NULL,
"title" VARCHAR(255) NOT NULL,
"createdAt" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"content" TEXT,
"published" BOOLEAN NOT NULL DEFAULT false,
"authorId" INTEGER NOT NULL,
CONSTRAINT "Post_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Profile" (
"id" SERIAL NOT NULL,
"bio" TEXT,
"userId" INTEGER NOT NULL,
CONSTRAINT "Profile_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL NOT NULL,
"name" VARCHAR(255),
"email" VARCHAR(255) NOT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "Profile_userId_key" ON "Profile"("userId");
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-- AddForeignKey
ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Profile" ADD CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;查看 SQL 迁移文件以确保一切正确无误。
接下来,使用 prisma migrate resolve 和 --applied 参数将迁移标记为已应用。
npx prisma migrate resolve --applied 0_init该命令将通过将 0_init 添加到 _prisma_migrations 表中将其标记为已应用。
你现在有了当前数据库架构的基线。要进一步更改数据库架构,可以更新 Prisma 架构并使用 prisma migrate dev 将更改应用到数据库。
