简介

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.jsonscripts中, 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.jsonscripts中配置了快捷脚本就运行对应的快捷脚本命令。

此时就会通过prisma,以操作对象的方式,通过mockjs随机生成一些数据,插入到数据库中去。

注意create是异步操作,记得使用async/await来实现同步处理,否则node可能直接运行结束了,导致异步还没完成,进程就结束,从而数据库没填充到数据。

分类: Nest.js 标签: MySQLprismaORM

评论

暂无评论数据

暂无评论数据

目录