Prisma

Introduction

  • It is an ORM that supports multiple database driver and contains data migration tool for migrating the data model to database via sql file to make sure the data consistency between data model and db schema

  • Its pattern is to grouping different data model together as a single file (schema first) , rather than separate it one by one (code first)

Commands

prisma db seed
  • To execute the custom logic of seed file, the seed file will also be executed after prisma migrate dev or prisma migrate deployis successful

prisma migrate reset
  • For development only, to delete all the data and table and rerun all the migration sql file again

prisma migrate dev
  • For development only

  • Reruns the existing migration history in the shadow database (second, temporary database that is created and deleted automatically)

  • After re-run, it will compare end state of history of shadow database and current state of database

  • It will use the checksum column of prisma migration table behind the scene

  • If detected there are diffs between state, it means that schema drift (edited or deleted migration file, or a manual changes to the database schema) are detected, you will be asked to reset your data

  • Applies pending migrations to the shadow database (for example, new migrations created by colleagues)

  • If it detects changes to the prisma schema, it generates a new migration from these changes

prisma migrate deploy
  • For production only

  • To apply the new migration sql file only, if it is failed , it will block the execution of other new sql file

prisma migrate diff \
 --from-empty \
 --to-schema-datamodel ./prisma/schema.prisma \
 --script > ./prisma/migrations/000000000000_squashed_migrations/migration.sql
  • It will compare the differences of from and to and generate the changes into one sql file

prisma migrate resolve \
 --applied 000000000000_squashed_migrations
  • Marked the sql file history status as resolved, so that the sql file will be new and executed by deployment command

prisma migrate resolve --rolled-back test
  • Marked the sql file history status as rolled back

  • It is needed to fix back the sql file manually

  • After rerun deployment command, the failed file will be re-run again

npx prisma db execute --file ./down.sql --schema prisma/schema.prisma
  • Directly run the sql file to the database without creating any prisma history

Extension

import { Logger } from '@nestjs/common';
import { Prisma, PrismaClient } from '@prisma/client';

export class PrismaExtendClient extends PrismaClient<Prisma.PrismaClientOptions,
 'query'> {
  private logger = new Logger(PrismaExtendClient.name);
  constructor(options?: ConstructorParameters<typeof PrismaClient>[0]) {
    super(options);
    // adding logging to each query
    this.$on('query', (e) => {
      this.logger.debug(`executed ${e.query} ${e.params}`);
    });
    return this.$extends({
      query: {
        group: {
          // override and extend the behaviours 
          async $allOperations({ model, operation, args, query }) {
            if (
              operation === 'count' ||
              operation === 'findMany' ||
              operation === 'findFirst' ||
              operation === 'updateMany'
            ) {
              args.where = { isDeprecated: false, ...args.where };
            }
            return query(args);
          },
        },
        modelFile: {
          async $allOperations({ model, operation, args, query }) {
            if (
              operation === 'findMany' ||
              operation === 'findFirst' ||
              operation === 'updateMany' ||
              operation === 'findUnique'
            ) {
              args.where = { ...args.where, deletedAt: null };
            }
            return query(args);
          },
        },
      },
    }) as this;
  }
}

Last updated

Was this helpful?