软件教程 2025年08月6日
0 收藏 0 点赞 305 浏览 4531 个字
摘要 :

文章目录 一、前言 二、 Prisma 1.安装所需包 2.初始化 3.连接数据库 4.迁移文件 1.结构定义 2.生成迁移 5.安装客户端 6.更新表结构 7.重置数据库 三、配置log日志输……




  • 一、前言
  • 二、 Prisma
  • 1.安装所需包
  • 2.初始化
  • 3.连接数据库
  • 4.迁移文件
    • 1.结构定义
    • 2.生成迁移
  • 5.安装客户端
  • 6.更新表结构
  • 7.重置数据库
  • 三、配置log日志输出
  • 简单配置
    • 在src目录下创建.env文件
    • 在src目录下创建config.ts文件
    • prisma日志配置
    • 在全局使用
  • 基于事务配置
  • 四、总结

一、前言

在本文中,我将介绍如何在NestJS中使用Prisma。Prisma是一个用于构建和管理数据库的工具,它可以与NestJS无缝集成,提供了一个强大和类型安全的查询语言,以及更加便捷的数据库CURD,具体使用请阅读本文。

二、 Prisma

本文基于mysql关系型数据库进行讲解,如需非关系型数据库的讲解,如MongoDB,请移步 从头开始使用 MongoDB

1.安装所需包

$ pnpm i prisma@5.5.2
$ pnpm i @prisma/client@5.5.2

2.初始化

$ npx prisma init

执行以上命令会创建.env文件与prisma文件夹

  • .env 用于定义数据库连接
  • prisma用于定义模型结构与数据迁移与数据填充文件

3.连接数据库

修改.env文件设置mysql连接,以下连接请根据你的情况修改

    DATABASE_URL=\"mysql://root:root@localhost:3306/databasename\"
    #定义环境
    NODE_ENV=development

注:databasename 是指你的数据库名,例如:mydatabase

4.迁移文件

迁移文件migrate用于构建数据表结构变化,他是数据库的版本控制机制,每次表结构的修改都有单独文件记录。

1.结构定义

在 prisman/schema.prisma 文件内定义表结构,你可以查看数据模型或 字段类型文档了解使用方法。本文重点在于从已创建好的数据库中迁移至prisma,以下仅做手动建表的示例,详细请查看Prisma 架构(参考)

    generator client {
      provider = \"prisma-client-js\"
    }

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

    model user {
      //BigInt类型    主键 自增值    非负BitInt
      id       BigInt    @id @default(autoincrement()) @db.UnsignedBigInt()
      //字符串,默认为varchar(191)
      email    String
      password String
      //添加时自动设置时间,即设置Mysql默认值为CURRENT_TIMESTAMP
      createdAt DateTime @default(now())
      // 让Prisma在添加与更新时自动维护该字段
      updatedAt DateTime @updatedAt
    }

2.生成迁移

①手动迁移

要将数据模型映射到数据库模式(即创建相应的数据库表),你需要使用 prisma migrate CLI 命令

$ npx prisma migrate dev --name init

该命令做了两件事:

  • 它为此迁移创建一个新的 SQL 迁移文件
  • 它针对数据库运行 SQL 迁移文件

该命令执行动作为:

  • 根据定义生成迁移文件
  • 执行新的迁移文件修改数据表
  • 生成 Prisma Client

②自动迁移

执行以下命令,将自动根据已经存在的数据库生成文件 prisman/schema.prisma ,而不需要向上面一样手动定义。

$ npx prisma db pull

5.安装客户端

$ npx prisma generate

客户端提供众多方法完成对数据的增删改查

6.更新表结构

使用  db push 来改变现有的原型架构,例如在某一个表中新增某个字段

$ npx prisma db push

7.重置数据库

如果你是使用自动迁移的方法导入映射关系,请确保你的数据留有备份,执行此操作在没有数据迁移记录的情况下,可能导致数据丢失。

通过运行以下命令自行 重置 数据库以撤消手动更改或  db push 的实验:

$ npx prisma migrate reset

该命令执行动作为:

如果环境允许,则删除数据库;如果环境不允许删除数据库,则执行软重置。

  • 如果数据库被删除,则创建相同名称的新数据库。
  • 适用于所有迁移。
  • 运行种子脚本。

三、配置log日志输出

本文的配置环境是node18.18.1;prisma与@prisma/client的版本均为5.5.2

简单配置

在src目录下创建.env文件

在env文件中

#定义环境
NODE_ENV=development

在src目录下创建config.ts文件

    //config.ts
    export default () => ({

      app: {

        name: \'MingxiangLuo\',

        isDev: process.env.NODE_ENV == \'development\',

      },

      database: {

        url: \'localhost\',
        
      },

    });

确保你的 prisma.module.ts 中有提供和导出PrismaService,例如:

    //prisma.module.ts
    import { Global, Module } from \'@nestjs/common\';

    import { PrismaService } from \'./prisma.service\';

    @Global()

    @Module({

      providers: [PrismaService],

      exports: [PrismaService],

    })

    export class PrismaModule {}

prisma日志配置

官方在文档中做了如下说明:配置日志记录(概念)

创建 prisma.service.ts ,粘贴如下代码

    import { Injectable } from \'@nestjs/common\';
    import { ConfigService } from \'@nestjs/config\';
    import { PrismaClient } from \'@prisma/client\';

    @Injectable()
    export class PrismaService extends PrismaClient {
      constructor(configService: ConfigService) {
        //输出查询SQL等LOG
        super(
          configService.getOrThrow(\'app.isDev\')
            ? { log: [\'query\', \'info\', \'warn\', \'error\'] }
            : undefined,
        );
      }
    }

创建prisma.module.ts,粘贴如下代码

    import { Global, Module } from \'@nestjs/common\';
    import { PrismaService } from \'./prisma.service\';

    @Global()
    @Module({
      providers: [PrismaService],
      exports: [PrismaService],
    })
    export class PrismaModule {}

在全局使用

app.module.ts添加如下代码

import { Module } from \'@nestjs/common\';
import { PrismaModule } from \'../prisma/prisma.module\';
import { ConfigModule } from \'@nestjs/config\';
import config from \'./config\';

@Module({
  imports: [
    PrismModule,
    ConfigModule.forRoot({
      isGlobal: true,
      load: [config],
    }),
  ],
  controllers: [],
  providers: [],

})

export class AppModule {}

在装饰器的构造函数中使用

constructor(

    private readonly prisma: PrismaService,

  ) {}

基于事务配置

当我根据官方的文档配置时(stdout转成基于事件)出现了以下问题:

在on监听报错:类型“string”的参数不能赋给类型“never”的参数。ts(2345)如何在NestJS中使用Prisma

通过各种百度,我发现这极有可能是本地ts语法检测有问题,于是我为报错的代码上一行添加 //@ts-ignore 这一句代码,即

//prisma.service.ts
import { Injectable} from \'@nestjs/common\';
import { ConfigService } from \'@nestjs/config\';
import { PrismaClient } from \'@prisma/client\';

@Injectable()
export class PrismaService extends PrismaClient {
  constructor(configService: ConfigService) {
    //输出查询SQL等LOG
    super(
      configService.getOrThrow(\'app.isDev\')
        ? {
            log: [
              {
                emit: \'event\',
                level: \'query\' as const,
              },
              {
                emit: \'stdout\',
                level: \'error\',
              },
              {
                emit: \'stdout\',
                level: \'info\',
              },
              {
                emit: \'stdout\',
                level: \'warn\',
              },
            ],
          }
        : undefined,
    );

    //@ts-ignore
    this.$on(\'query\', async (e) => {
      //@ts-ignore
      let timestamp = new Date();
      //@ts-ignore
      let query = e.query;
      //@ts-ignore
      let params = JSON.parse(e.params);
      //@ts-ignore
      let duration = e.duration;
      console.log({
        Timestamp: timestamp,
        Query: query,
        Params: params,
        Duration: duration,
      });
    });
  }
}

以上代码无报错提示,能够正常打印输出log日志

四、总结

本文为您介绍了如何在NestJS中使用Prisma以及配置prisma日志记录,希望通过本文的学习能够帮助您更好地使用NestJS搭建服务端。以上就是如何在NestJS中使用Prisma的全部内容,希望对你有帮助!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6397.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

270
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

108
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

684
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

340
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

372
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

844
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号