Prisma 的全部命令和 schema 语法
Prisma 的全部命令
npx prisma -h
- 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:这是连接数据库的密码。在实际使用中,你应该替换成你的实际数据库密码。
数据库与 Schema 同步
拉取数据库结构到 Schema
prisma db pull
此命令将数据库中的表结构同步到 Prisma 的 schema 文件中。现在连接的 prisma_test 数据库里是有这两个表:执行
prisma db pull
后:
推送 Schema 更改到数据库
prisma db push
将 schema 文件中的更改推送到数据库,同步表结构。我们先把表全部删除:执行
prisma db push
后:重新生成了这两张表。
数据迁移
创建与应用迁移:
prisma migrate dev --name init
此命令根据 schema 的更改生成 SQL 文件,并执行这些 SQL 来更新数据库结构,同时生成客户端代码。数据库中的 _prisma_migrations 表记录所有迁移历史,有助于跟踪每次迁移的详细信息:
数据初始化与脚本执行
数据初始化脚本
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
来插入初始数据:数据正确插入了。
执行 SQL 脚本
写一个 prisma/test.sql:执行命令:
prisma 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 的当前版本信息。这对于调试问题或确保使用的是最新功能非常有用。
全部 schema 语法
初始化项目
首先,创建一个新的项目目录并初始化:
mkdir prisma-schema
cd prisma-schema
npm init -y
npm install prisma -g
在项目目录中执行初始化命令:
prisma init
这将生成 .env
和 schema.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 文件并执行:
扩展模型和迁移
添加更复杂的模型,例如:
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
生成了表:
定义关系
定义一对多和多对多的模型关系:
// 定义部门模型,代表数据库中的一个部门表
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 方法及其参数类型等:
总结
generator 部分可以指定多种生成器,比如生成 docs 等,可以指定生成代码的位置。datasource 是配置数据库的类型和连接 url 的。model 部分定义和数据库表的对应关系:
- @id 定义主键
- @default 定义默认值
- @map 定义字段在数据库中的名字
- @db.xx 定义对应的具体类型
- @updatedAt 定义更新时间的列
- @unique 添加唯一约束
- @relation 定义外键引用
- @@map 定义表在数据库中的名字
- @@index 定义索引
- @@id 定义联合主键
此外,还可以通过 enum 来创建枚举类型。这些就是常用的 schema 语法了。
转载自:https://juejin.cn/post/7374299311935127578