likes
comments
collection
share

Prisma 的全部命令和 schema 语法

作者站长头像
站长
· 阅读数 28

Prisma 的全部命令

npx prisma -h

Prisma 的全部命令和 schema 语法

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

环境设置与初始化

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

mkdir prisma-all-command
cd prisma-all-command
npm init -y
npm install prisma -g
prisma init

初始化与配置

执行 init 命令:

prisma init --datasource-provider mysql

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

修改数据库连接:

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

Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法

数据库与 Schema 同步

拉取数据库结构到 Schema

prisma db pull

此命令将数据库中的表结构同步到 Prisma 的 schema 文件中。现在连接的 prisma_test 数据库里是有这两个表:Prisma 的全部命令和 schema 语法执行 prisma db pull 后:Prisma 的全部命令和 schema 语法

推送 Schema 更改到数据库

prisma db push

将 schema 文件中的更改推送到数据库,同步表结构。我们先把表全部删除:Prisma 的全部命令和 schema 语法执行 prisma db push 后:Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法重新生成了这两张表。

数据迁移

创建与应用迁移:

prisma migrate dev --name init

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

数据初始化与脚本执行

数据初始化脚本

prisma/seed.ts:

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
	const user = await prisma.user.create({
		data: {
			name: '云牧',
			email: 'xx@xx.com',
			Post: {
				create: [
					{ title: '文章1', content: '内容1' },
					{ title: '文章2', content: '内容2' },
				],
			},
		},
	});
	console.log(user);
}

main();

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

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

执行命令 prisma db seed 来插入初始数据:Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法数据正确插入了。

执行 SQL 脚本

写一个 prisma/test.sql:Prisma 的全部命令和 schema 语法执行命令:

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

Prisma 的全部命令和 schema 语法SQL 脚本执行后,会删除 id 为 2 的文章:Prisma 的全部命令和 schema 语法

重置数据库

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

代码生成

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

图形界面操作

prisma studio 提供了一个用户友好的图形界面,使得用户可以直接在浏览器中进行数据的增删改查操作:Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法用户可以通过界面直接编辑、删除或新增数据记录。一般我更倾向使用如 MySQL Workbench,进行数据库操作。

Schema 验证

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

文件格式化

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

版本信息

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

全部 schema 语法

初始化项目

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

mkdir prisma-schema
cd prisma-schema
npm init -y
npm install prisma -g

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

prisma init

这将生成 .envschema.prisma 文件。

配置数据库

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

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

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

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id    Int    @id @default(autoincrement())
  email String @unique
  name  String?
}

生成客户端代码

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

prisma generate

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

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

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

数据库迁移

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

prisma migrate dev --name init_migration

这会根据模型生成相应的 SQL 文件并执行:Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法

扩展模型和迁移

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

model Test {
  id Int    @id @default(autoincrement()) // 定义一个名为 id 的整数字段,作为主键,且自动递增
  t1 String @db.Text // 定义一个名为 t1 的文本字段,使用数据库的 Text 类型存储
  t2 Int    @map("tt2") @db.TinyInt // 定义一个名为 t2 的整数字段,使用数据库的 TinyInt 类型,实际在数据库中的字段名为 tt2
  t3 String @unique @db.VarChar(50) // 定义一个名为 t3 的字符串字段,限定最大长度为50,且在数据库中该字段值唯一

  @@index([t2, t3]) // 为 t2 和 t3 字段创建一个复合索引
  @@map("test_test") // 指定在数据库中该表的实际名称为 test_test
}

运行迁移:

npx prisma migrate dev --name m1

Prisma 的全部命令和 schema 语法生成了表:Prisma 的全部命令和 schema 语法Prisma 的全部命令和 schema 语法

定义关系

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

// 定义部门模型,代表数据库中的一个部门表
model Department {
  id        Int       @id @default(autoincrement())  // 部门ID,自动递增的主键
  name      String    @db.VarChar(20)                // 部门名称,最大长度20个字符
  createTime DateTime @default(now())               // 创建时间,默认为当前时间
  updateTime DateTime @updatedAt                    // 更新时间,每次记录更新时自动设置为当前时间
  employees Employee[]                              // 与 Employee 模型的一对多关系,表示部门下的员工
}

// 定义员工模型,代表数据库中的一个员工表
model Employee {
  id          Int        @id @default(autoincrement())  // 员工ID,自动递增的主键
  name        String     @db.VarChar(20)                // 员工名称,最大长度20个字符
  phone       String     @db.VarChar(30)                // 员工电话,最大长度30个字符
  departmentId Int                                     // 关联的部门ID
  department  Department @relation(fields: [departmentId], references: [id])  // 建立与 Department 模型的多对一关系
}

// 定义帖子模型,代表数据库中的一个帖子表
model Post {
  id        Int         @id @default(autoincrement())  // 帖子ID,自动递增的主键
  title     String                                     // 帖子标题
  content   String?                                    // 帖子内容,可选字段
  published Boolean     @default(false)                // 发布状态,默认为未发布
  tags      TagOnPosts[]                               // 与 TagOnPosts 模型的一对多关系,表示帖子与标签的关联
}

// 定义标签模型,代表数据库中的一个标签表
model Tag {
  id    Int         @id @default(autoincrement())  // 标签ID,自动递增的主键
  name  String                                     // 标签名称
  posts TagOnPosts[]                               // 与 TagOnPosts 模型的一对多关系,表示标签与帖子的关联
}

// 定义帖子与标签的关联模型,代表数据库中的一个中间表,用于实现多对多关系
model TagOnPosts {
  post   Post @relation(fields: [postId], references: [id])  // 关联到 Post 模型,表示帖子
  postId Int                                                // 帖子ID
  tag    Tag @relation(fields: [tagId], references: [id])   // 关联到 Tag 模型,表示标签
  tagId  Int                                                // 标签ID
  @@id([postId, tagId])                                     // 设置 postId 和 tagId 的组合为表的主键,确保唯一性
}
  • Department 模型:代表一个部门,包含基本信息和与员工的关联。部门可以有多个员工。
  • Employee 模型:代表一个员工,包含基本信息和与部门的关联。每个员工属于一个部门。
  • Post 模型:代表一个帖子,包含标题、内容和发布状态。帖子可以有多个标签。
  • Tag 模型:代表一个标签,可以标记多个帖子。
  • TagOnPosts 模型:是一个中间表模型,用于实现帖子和标签之间的多对多关系。每个记录都包含一个帖子和一个标签的关联。

使用枚举

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

// 定义一个名为 Role 的枚举类型,包含三个可能的值:ADMIN、USER、GUEST
enum Role {
  ADMIN, // 表示管理员角色
  USER,  // 表示用户角色
  GUEST  // 表示访客角色
}

// 定义一个名为 Account 的模型,代表账户信息
model Account {
  id      Int      @id @default(autoincrement()) // 账户的唯一标识ID,自增长
  name    String?  // 账户的名称,是一个可选字段(可能为 null)
  role    Role     @default(USER) // 账户的角色,如果没有指定,默认为 USER(用户)
}

生成文档

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

npm install prisma-docs-generator -D

schema.prisma:

generator docs {
  provider = "node node_modules/prisma-docs-generator"
  output   = "../generated/docs"
}

运行 npx prisma generate 生成文档。

查看生成的文档

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

npx http-server ./generated/docs

文档中会列出所有模型的字段、CRUD 方法及其参数类型等:Prisma 的全部命令和 schema 语法

总结

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

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

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

转载自:https://juejin.cn/post/7374299311935127578
评论
请登录