1npx prisma -h

  • init:创建 schema 文件,初始化项目结构。
  • generate:根据 schema 文件生成客户端代码。
  • db:包括数据库与 schema 的同步。
  • migrate:处理数据表结构的迁移。
  • studio:提供图形化界面进行 CRUD 操作。
  • validate:验证 schema 文件的语法。
  • format:格式化 schema 文件。
  • version:显示版本信息。

环境设置与初始化

首先,我们需要创建一个新的项目并设置 Prisma:

 1mkdir prisma-all-command
 2cd prisma-all-command
 3npm init -y
 4npm install prisma -g
 5prisma init

初始化与配置

执行 init 命令:

 1prisma init --datasource-provider mysql

执行后,生成 prisma/schema.prisma.env 文件,配置数据库连接。

修改数据库连接:

  • 可通过修改 .env 文件中的 URL 来更改数据库连接,例如:
 1prisma init --url mysql://root:password@localhost:3306/prisma_test
  • password:这是连接数据库的密码。在实际使用中,你应该替换成你的实际数据库密码。

数据库与 Schema 同步

拉取数据库结构到 Schema

 1prisma db pull

此命令将数据库中的表结构同步到 Prisma 的 schema 文件中。
现在连接的 prisma_test 数据库里是有这两个表:

执行 prisma db pull 后:

推送 Schema 更改到数据库

 1prisma db push

将 schema 文件中的更改推送到数据库,同步表结构。
我们先把表全部删除:

执行 prisma db push 后:

重新生成了这两张表。

数据迁移

创建与应用迁移:

 1prisma migrate dev --name init

此命令根据 schema 的更改生成 SQL 文件,并执行这些 SQL 来更新数据库结构,同时生成客户端代码。
数据库中的 _prisma_migrations 表记录所有迁移历史,有助于跟踪每次迁移的详细信息:

数据初始化与脚本执行

数据初始化脚本

prisma/seed.ts:

 1import { PrismaClient } from '@prisma/client';
 2const prisma = new PrismaClient();
 3async function main() {
 4	const user = await prisma.user.create({
 5		data: {
 6			name: '云牧',
 7			email: 'xx@xx.com',
 8			Post: {
 9				create: [
10					{ title: '文章1', content: '内容1' },
11					{ title: '文章2', content: '内容2' },
12				],
13			},
14		},
15	});
16	console.log(user);
17}
18
19main();

在 package.json 中添加脚本执行命令:

 1"prisma": {
 2    "seed": "npx ts-node prisma/seed.ts"
 3}

执行命令 prisma db seed 来插入初始数据:

数据正确插入了。

执行 SQL 脚本

写一个 prisma/test.sql:

执行命令:

 1prisma db execute --file prisma/test.sql --schema prisma/schema.prisma

SQL 脚本执行后,会删除 id 为 2 的文章:

重置数据库

使用 prisma migrate reset 命令可以重置数据库,清空所有数据,并重新执行所有迁移和数据初始化。

代码生成

prisma generate 命令用于根据 schema.prisma 文件生成 Prisma 客户端代码,这些代码位于 node_modules/@prisma/client 目录下,主要用于实现 CRUD 操作。
注意:该命令不会同步数据库结构,仅根据 schema 文件生成客户端代码。

图形界面操作

prisma studio 提供了一个用户友好的图形界面,使得用户可以直接在浏览器中进行数据的增删改查操作:

用户可以通过界面直接编辑、删除或新增数据记录。
一般我更倾向使用如 MySQL Workbench,进行数据库操作。

Schema 验证

prisma validate 命令用于检查 schema.prisma 文件中是否存在语法错误。
安装 Prisma 的 VSCode 插件后,可以在编辑器内直接看到 schema 文件的错误,类似于 ESLint 的功能。

文件格式化

prisma format 命令用于自动格式化 schema.prisma 文件,确保文件的风格一致性和可读性。
安装 Prisma 的 VSCode 插件,直接使用编辑器的格式化功能来格式化 schema 文件,提高开发效率。

版本信息

prisma version 命令用于显示 Prisma CLI 和 Prisma Client 的当前版本信息。这对于调试问题或确保使用的是最新功能非常有用。

初始化项目

首先,创建一个新的项目目录并初始化:

 1mkdir prisma-schema
 2cd prisma-schema
 3npm init -y
 4npm install prisma -g

在项目目录中执行初始化命令:

 1prisma init

这将生成 .envschema.prisma 文件。

配置数据库

编辑 .env 文件,设置数据库连接信息:

 1DATABASE_URL="mysql://root:输入自己的密码@localhost:3306/prisma_test"

schema.prisma 文件中配置数据源和模型:

 1datasource db {
 2  provider = "mysql"
 3  url      = env("DATABASE_URL")
 4}
 5
 6model User {
 7  id    Int    @id @default(autoincrement())
 8  email String @unique
 9  name  String?
10}

生成客户端代码

运行以下命令生成 Prisma 客户端:

 1prisma generate

客户端代码默认生成在 node_modules/@prisma/client。可以通过修改 schema.prisma 中的 generator 配置来改变输出目录:

 1generator client {
 2  provider = "prisma-client-js"
 3  output   = "../generated/client"
 4}

重新运行 prisma generate,客户端代码将在指定的目录生成。

数据库迁移

使用以下命令创建和运行迁移:

 1prisma migrate dev --name init_migration

这会根据模型生成相应的 SQL 文件并执行:

扩展模型和迁移

添加更复杂的模型,例如:

 1model Test {
 2  id Int    @id @default(autoincrement()) // 定义一个名为 id 的整数字段,作为主键,且自动递增
 3  t1 String @db.Text // 定义一个名为 t1 的文本字段,使用数据库的 Text 类型存储
 4  t2 Int    @map("tt2") @db.TinyInt // 定义一个名为 t2 的整数字段,使用数据库的 TinyInt 类型,实际在数据库中的字段名为 tt2
 5  t3 String @unique @db.VarChar(50) // 定义一个名为 t3 的字符串字段,限定最大长度为50,且在数据库中该字段值唯一
 6
 7  @@index([t2, t3]) // 为 t2 和 t3 字段创建一个复合索引
 8  @@map("test_test") // 指定在数据库中该表的实际名称为 test_test
 9}

运行迁移:

 1npx prisma migrate dev --name m1

生成了表:

定义关系

定义一对多和多对多的模型关系:

 1
 2model Department {
 3  id        Int       @id @default(autoincrement())  
 4  name      String    @db.VarChar(20)                
 5  createTime DateTime @default(now())               
 6  updateTime DateTime @updatedAt                    
 7  employees Employee[]                              
 8}
 9
10
11model Employee {
12  id          Int        @id @default(autoincrement())  
13  name        String     @db.VarChar(20)                
14  phone       String     @db.VarChar(30)                
15  departmentId Int                                     
16  department  Department @relation(fields: [departmentId], references: [id])  
17}
18
19
20model Post {
21  id        Int         @id @default(autoincrement())  
22  title     String                                     
23  content   String?                                    
24  published Boolean     @default(false)                
25  tags      TagOnPosts[]                               
26}
27
28
29model Tag {
30  id    Int         @id @default(autoincrement())  
31  name  String                                     
32  posts TagOnPosts[]                               
33}
34
35
36model TagOnPosts {
37  post   Post @relation(fields: [postId], references: [id])  
38  postId Int                                                
39  tag    Tag @relation(fields: [tagId], references: [id])   
40  tagId  Int                                                
41  @@id([postId, tagId])                                     
42}
  • Department 模型:代表一个部门,包含基本信息和与员工的关联。部门可以有多个员工。
  • Employee 模型:代表一个员工,包含基本信息和与部门的关联。每个员工属于一个部门。
  • Post 模型:代表一个帖子,包含标题、内容和发布状态。帖子可以有多个标签。
  • Tag 模型:代表一个标签,可以标记多个帖子。
  • TagOnPosts 模型:是一个中间表模型,用于实现帖子和标签之间的多对多关系。每个记录都包含一个帖子和一个标签的关联。

使用枚举

定义枚举类型并在模型中使用:

 1
 2enum Role {
 3  ADMIN, 
 4  USER,  
 5  GUEST  
 6}
 7
 8
 9model Account {
10  id      Int      @id @default(autoincrement()) 
11  name    String?  
12  role    Role     @default(USER) 
13}

生成文档

安装并配置额外的 generator,例如文档:

 1npm install prisma-docs-generator -D

schema.prisma:

 1generator docs {
 2  provider = "node node_modules/prisma-docs-generator"
 3  output   = "../generated/docs"
 4}

运行 npx prisma generate 生成文档。

查看生成的文档

使用 HTTP 服务器查看生成的文档:

 1npx http-server ./generated/docs

文档中会列出所有模型的字段、CRUD 方法及其参数类型等:

总结

generator 部分可以指定多种生成器,比如生成 docs 等,可以指定生成代码的位置。
datasource 是配置数据库的类型和连接 url 的。
model 部分定义和数据库表的对应关系:

  • @id 定义主键
  • @default 定义默认值
  • @map 定义字段在数据库中的名字
  • @db.xx 定义对应的具体类型
  • @updatedAt 定义更新时间的列
  • @unique 添加唯一约束
  • @relation 定义外键引用
  • @@map 定义表在数据库中的名字
  • @@index 定义索引
  • @@id 定义联合主键

此外,还可以通过 enum 来创建枚举类型。
这些就是常用的 schema 语法了。

个人笔记记录 2021 ~ 2025