上节我们入门了 prisma,定义了 model 和表的映射,并且做了 CRUD。
这节来过一遍 Prisma 的全部命令。
npx prisma -h
有这些:
init:创建 schema 文件
generate: 根据 shcema 文件生成 client 代码
db:同步数据库和 schema
migrate:生成数据表结构更新的 sql 文件
studio:用于 CRUD 的图形化界面
validate:检查 schema 文件的语法错误
format:格式化 schema 文件
version:版本信息
我们一个个来过一遍。
先创建个新项目:
mkdir prisma-all-command
cd prisma-all-command
npm init -y
全局安装 prisma,这个是命令行工具的包:
npm install -g prisma
prisma init
首先来试一下 init 命令:
这个就是创建 schema 文件的,可以指定连接的 database,或者指定 url。
我们试一下:
prisma init
执行 init 命令后生成了 prisma/shcema.prisma 和 .env 文件:
包含了 db provider,也就是连接的数据库,以及连接的 url:
删掉这俩文件,重新生成。
prisma init --datasource-provider mysql
这样生成的就是连接 mysql 的 provider 和 url 了:
其实就是改这两处的字符串,prisma init 之后自己改也行。
再删掉这俩文件,我们重新生成。
prisma init --url mysql://root:guang@localhost:3306/prisma_test
这次指定连接字符串。
可以看到,provider 会根据你指定的 url 来识别,并且 .env 里的 url 就是我们传入的:
prisma db
创建完 schema 文件,如何定义 model 呢?
其实 init 命令的打印提示了:
你可以执行 prisma db pull 把数据库里的表同步到 schema 文件。
我们试一下:
prisma db pull
提示发现了 2 个 model 并写入了 schema 文件。
现在连接的 prisma_test 数据库里是有这两个表的:
生成的 model 定义是这样的:
其中,@@index 是定义索引,这里定义了 authorId 的外键索引。
此外,db 命令还有别的功能:
prisma db -h
试下 prisma db push 命令:
首先在 mysql workbench 里把这两个表删掉:
然后执行 db push:
prisma db push
提示同步到了 database,并且生成了 client 代码。
在 mysql workbench 里可以看到新的表:
seed 命令是执行脚本插入初始数据到数据库。
我们用 ts 来写,先安装相关依赖:
npm install typescript ts-node @types/node --save-dev
创建 tsconfig.json
npx tsc --init
然后写下初始化脚本 prisma/seed.ts
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({
log: [
{
emit: 'stdout',
level: 'query'
},
],
});
async function main() {
const user = await prisma.user.create({
data: {
name: '东东东',
email: 'dongdong@dong.com',
Post: {
create: [
{
title: 'aaa',
content: 'aaaa'
},
{
title: 'bbb',
content: 'bbbb'
}
]
},
},
})
console.log(user)
}
main();
在 package.json 添加 seed 命令的配置:
"prisma": {
"seed": "npx ts-node prisma/seed.ts"
},
然后执行 seed:
prisma db seed
在 mysql workbench 里可以看到数据被正确插入了:
其实 seed 命令就是把跑脚本的过程封装了一下,和直接用 ts-node 跑没啥区别。
然后是 prisma db execute,这个是用来执行 sql 的。
比如我写一个 prisma/test.sql 的文件:
delete from Post WHERE id = 2;
然后执行 execute:
prisma db execute --file prisma/test.sql --schema prisma/schema.prisma
这里 --file 就是指定 sql 文件的。
而 --schema 指定 schema 文件,主要是从中拿到数据库连接信息。
然后去 mysql workbench 里看一下,确实 id 为 2 的 Post 数据没有了:
这就是 db 的 4 个命令。
prisma migrate
mirgrate 是迁移的意思,在这里是指表的结构变化。
prisma migrate 有这些子命令:
我们分别来看一下。
首先是 prisma migrate dev。
这个我们前面用过,它会根据 schema 的变化生成 sql 文件,并执行这个 sql,还会生成 client 代码。
prisma migrate dev --name init
因为之前创建过表,并且有数据。
它会提示是否要 reset:
选择是,会应用这次 mirgration,生成 sql 文件:
并且会生成 client 代码,而且会自动执行 prisma db seed,插入初始化数据。
这样就既创建了表,又插入了初始数据,还生成了 client。
我们开发的时候经常用这个命令。
在 prisma/migrations 下会保存这次 migration 的 sql 文件。
目录名是 “年月日时分秒_名字” 的格式:
那如果我们改一下 schema 文件,再次执行 migrate dev 呢?
在 Post 的 model 定义里添加 tag 字段:
tag String @default("")
然后 migrate dev:
prisma migrate dev --name age-field
这次生成的 sql 只包含了修改表结构的:
在数据库中有个 _prisma_migrations 表,记录着数据库 migration 的历史:
如果把这个表删掉,再次 mirgate dev 就会有前面的是否 reset 的提示了:
如果你想手动触发reset,可以用 reset 命令:
它会清空数据然后执行所有 migration
prisma migrate reset
会提示会丢失数据,确认后就会重置表,然后执行所有 migration:
还会生成 client 代码,并且执行 prisma db seed 来初始化数据。
prisma generate
generate 命令只是用来生成 client 代码的,他并不会同步数据库:
只是根据 schema 定义,在 node_modules/@prisma/client 下生成代码,用于 CRUD。
prisma studio
这个是可以方便 CRUD 数据的图形界面:
prisma studio
选择一个 model:
会展示它的所有数据:
可以编辑记录:
删除记录:
新增记录:
不过一般我们都用 mysql workbench 来做。
prisma validate
这个是用来检查 schema 文件是否有语法错误的:
比如我写错一个类型,然后执行 validate:
prisma validate
会提示这里有错误:
当然,我们安装了 prisma 的插件之后,可以直接在编辑器里看到这个错误:
就和 eslint 差不多。
prisma format
这个是用来格式化 prisma 文件的:
当然,你安装了 prisma 的 vscode 插件之后,也可以直接用编辑器的 format:
prisma version
这个就是展示一些版本信息的,比较简单:
案例代码在小册仓库
总结
这节我们学习了 prisma 的全部命令:
init:创建 schema 文件
generate: 根据 shcema 文件生成 client 代码
db:同步数据库和 schema
migrate:生成数据表结构更新的 sql 文件
studio:用于 CRUD 的图形化界面
validate:检查 schema 文件的语法错误
format:格式化 schema 文件
version:版本信息
其中,prisma init、prisma migrate dev 是最常用的。
prisma db pull、prisma db push 也可以方便的用来做 schema 和数据库的同步。
常用的命令也没有几个,多拥几遍就熟了。