xzz2021
Published on 2025-11-21 / 1 Visits
0
0

nestjs迁移升级prisma7.0版本

主要变化: 引入prisma.config.ts 用于配置env,seed等所有prisma设置项目,与package.jsonschema解耦;同时client改为原始js代码,并生成到指定自定义目录,极大提高编译打包效率,避免不同环境生成client!

主要操作: 以下以使用自己的postgres数据库为例

  1. 先移除之前安装的相关依赖, 安装以下依赖项最新版

    npm install prisma @types/node @types/pg -D
    npm install @prisma/client @prisma/adapter-pg pg dotenv
    
    
  2. 初始化自动生成schema和env及prisma.config.ts文件,也可以手动添加,记得prisma.config.t里更改目录

    npx prisma init --datasource-provider postgresql --output src/prisma/generated/prisma
    

    自动生成的schema文件内容(命令里的output即指定目录,其余文件生成到根目录):

    generator client {
      provider = "prisma-client"
      output   = "./generated/prisma"
    }
    
    datasource db {
      provider = "postgresql"
    }
    

    自动生成的env文件内容:

    # 如果env已存在会增量添加以下内容
    
    DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
    

    自动生成的prisma.config.ts文件内容:

    // This file was generated by Prisma and assumes you have installed the following:
    // npm install --save-dev prisma dotenv
    import 'dotenv/config';
    import { defineConfig, env } from 'prisma/config';
    
    export default defineConfig({
      schema: 'src/prisma/schema.prisma',
      migrations: {
        path: 'src/prisma/migrations',
        seed: 'ts-node src/prisma/seed.ts',  //  变化: seed改到此文件定义
      },
      datasource: {
        url: env('DATABASE_URL'),
      },
    });
    
  3. 其余命令都没变

    1. 定义好schema,同步数据库,执行  npx prisma migrate dev
    2. 生成client,执行   npx prisma generate  
    3. 生成seed数据,注意seed配置需要改到prisma.config.ts文件, 执行   npx prisma db seed
    
  4. 常规使用方式

    // lib/prisma.ts
    import { PrismaPg } from '@prisma/adapter-pg';
    import 'dotenv/config';
    import { PrismaClient } from '../generated/prisma/client';
    const connectionString = `${process.env.DATABASE_URL}`;
    
    const adapter = new PrismaPg({ connectionString });
    const prisma = new PrismaClient({ adapter });
    
    export { adapter, prisma };
    
  5. nestjs引入使用

    import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
    import { PrismaClient } from './generated/prisma/client';
    import { adapter } from './lib/prisma';
    
    @Injectable()
    export class PgService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
      constructor() { super({ adapter }) }
       
      async onModuleInit() {
        await this.$connect();
      }
      
      async onModuleDestroy() {
        await this.$disconnect();
      }
    }
    
  6. 缺陷: 如果希望同时管理多种类型的数据库, 7.0版本将schema的路径定义改到prisma.config.ts里了, 但暂时不支持多个schema数据,还是只能命令行额外执行指定路径


Comment