prisma 首次使用
简介
prisma是一款ORM库,用于处理数据库相关内容,它通过一份Prisma Schema
文件来描述数据库的结构,除了我们日常能看到的字段之外,还能看到一些链表,外键这些平时可视化看不到的内容。
prisma还提供了vscode的插件用于语法提示,以及cli相关的一些便捷功能,比如将每次字段改动记录成一个sql操作,使用reset操作都会运行之前记录的sql操作。
而且cli操作是入侵很小的操作,他会在当前项目创建一个单独的prisma目录用于处理相关事宜,并不会影响已写的代码。
所以在使用之前我们先处理下一些依赖:
vscode安装插件:Prisma
格式化.prisma
文件使用该插件
项目安装依赖:
pnpm i prisma @prisma/client
初始化
在项目中运行命令:
npx prisma init
此时便会在项目中生成prisma目录和.env环境变量文件。
链接mysql
默认链接使用的是环境变量的DATABASE_URL
字段,我们找到.env环境变量文件,打开并修改DATABASE_URL格式为:
DATABASE_URL="mysql://数据库用户名:数据库密码@数据库地址:数据库端口/数据库名"
其中数据库用户和密码需要使用最顶级的,因为prisma 会判断,如果不存在指定的的数据库名,就会自己创建,如果你只给某个数据库的用户账号,它是没有这个权限的,就会导致运行失败。
配置 schema.prisma
将db的provider值改为mysql。
url使用默认的方式,读取env环境变量,如果不需要也可以手动改成字符串形式,内容就是DATABASE_URL
的值。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
然后就是添加数据库模型配置:
model User {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
email String
password String
avatar String?
github String?
created_time DateTime @default(now())
updated_time DateTime @updatedAt
}
model Category {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
title String
articles Article[]
}
model Article {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
title String
content String @db.Text
thumb String
author String
created_time DateTime @default(now())
updated_time DateTime @updatedAt()
Category Category @relation(fields: [categoryId], references: [id], onDelete: Cascade)
categoryId BigInt @db.UnsignedBigInt
}
其中articles 表示分类模型需要关联文章,具体体现在Article
的后面两行。
categoryId
关联Category
的id字段,如果分类被删除了,文章也会删除,通过onDelete: Cascade
实现
配置完毕后我们使用迁移来生成sql动作记录
npx prisma migrate dev --name init
name后面填写本次生成的说明,不能中文,比如这次是init
操作,最终会在prisma/migrations
中生成20230406085100_init
格式的目录。
里面会有sql文件。
reset
当我们需要重置数据库可以使用reset命令
npx prisma migrate reset
它会将数据库重置,哪怕此时mysql里面已经有内容了,同时还会运行seed
命令,用于数据填充,比如造假数据
数据库seeding
Prisma 的集成 seeding 功能可以写在package.json
的scripts
中, prisma db seed
会立即执行 seeding。
首先我们需要在package.json
中插入一个seed配置:
{
"prisma": {
"seed": "ts-node prisma/seed.ts"
},
}
使用ts-node运行prisma
目录下的seed.ts
文件。
默认nest.js初始化项目就已经安装了ts-node,所以不需要手动再安装,然后对应的seed.ts文件就自行创建了。
代码示例:
import { PrismaClient } from "@prisma/client";
import { Random } from "mockjs"; //利用mockjs来随机生成数据,自行安装依赖
//实例化
const prisma = new PrismaClient();
async function run() {
await prisma.user.create({
data: {
email: Random.email(),
password: Random.string(6, 10),
avatar: Random.image("200x100", "#50B347", "#FFF", "png", "avatar"),
github: Random.url(),
},
});
}
run();
填充时运行命令:
npx prisma db seed
如果在package.json
的scripts
中配置了快捷脚本就运行对应的快捷脚本命令。
此时就会通过prisma,以操作对象的方式,通过mockjs随机生成一些数据,插入到数据库中去。
注意create
是异步操作,记得使用async/await来实现同步处理,否则node可能直接运行结束了,导致异步还没完成,进程就结束,从而数据库没填充到数据。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据