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=SCHEMA
USER
:数据库用户的名称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
将更改应用到数据库。