Skip to main content
Prisma Documentation Docs

Search documentation

Type to search this documentation.

On this pageOverview

Upgrade to v7

Prisma ORM v7 introduces breaking changes when you upgrade from an earlier Prisma ORM version. This guide explains how this upgrade might affect your application and gives instructions on how to handle any changes.

Questions answered in this page
  • What changed in Prisma v7?
  • How do I upgrade safely?
  • Which breaking changes affect my app?

For developers using AI Agents, we have a migration prompt that you can add to your project for automatic migrations.

To upgrade to Prisma ORM v7 from an earlier version, you need to update both the prisma and @prisma/client packages:

bun add @prisma/client@7

bun add --dev prisma@7
Bash
pnpm add @prisma/client@7
pnpm add -D prisma@7
Bash
yarn add @prisma/client@7
yarn add --dev prisma@7
Bash
npm install @prisma/client@7
npm install -D prisma@7

[!CAUTION] Before you upgrade, check each breaking change below to see how the upgrade might affect your application.

This section gives an overview of breaking changes in Prisma ORM v7.

Minimum Version Recommended
Node 20.19.0 22.x
TypeScript 5.4.0 5.9.x

Prisma ORM now ships as an ES module, the module format supported in Bun, Deno, and Node. Set the type field in your package.json to module

{

  "type": "module",

  "scripts": {...},

}

If you are using TypeScript, you need to configure your tsconfig.json to be able to consume ES modules

{

  "compilerOptions": {

    "module": "ESNext",

    "moduleResolution": "bundler",

    "target": "ES2023",

    "strict": true,

    "esModuleInterop": true

  }

}

The older prisma-client-js provider will be removed in future releases of Prisma ORM. Upgrade to the new prisma-client provider which uses the new Rust-free client. This will give you faster queries, smaller bundle size, and require less system resources when deployed to your server.

The output field is now required in the generator block. Prisma Client will no longer be generated in node_modules by default. You must specify a custom output path.

title="Before"
generator client {

  provider = "prisma-client-js"

  engineType = "binary"

}
After
generator client {
  provider = "prisma-client"
  output   = "./generated/prisma"
}

After running npx prisma generate, you'll need to update your imports to use the new generated path:

// Before

import { PrismaClient } from "@prisma/client";

// After

import { PrismaClient } from "./generated/prisma/client";

Additionally other fields such as url, directUrl, and shadowDatabaseUrl in the datasource block are deprecated. You can configure them in the Prisma Config.

If you were previously using directUrl to run migrations then you need to pass the directUrl value in the url field of prisma.config.ts instead as the connection string defined in url is used by Prisma CLI for migrations.

title="prisma.config.ts"
import "dotenv/config";

import { defineConfig, env } from "prisma/config";

export default defineConfig({

  datasource: {

    url: env("DATABASE_URL"),

    shadowDatabaseUrl: env("SHADOW_DATABASE_URL"),

  },

});

The way to create a new Prisma Client has changed to require a driver adapter for all databases. This change is part of the move to make the main Prisma Client as lean and open as possible. For instance, if you are using Prisma Postgres, you now need the @prisma/adapter-pg adapter. This also means the signature for creating a new Prisma Client has changed slightly:

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient({

  datasources: {

    db: { url: process.env.DATABASE_URL },

  },

  datasourceUrl: process.env.DATABASE_URL,

});
import { PrismaClient } from "./generated/prisma/client";

import { PrismaPg } from "@prisma/adapter-pg";

const adapter = new PrismaPg({

  connectionString: process.env.DATABASE_URL,

});

export const prisma = new PrismaClient({ adapter });

If you are using SQLite, you can use the @prisma/adapter-better-sqlite3:

import { PrismaClient } from "./generated/prisma/client";

import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";

const adapter = new PrismaBetterSqlite3({

  url: process.env.DATABASE_URL || "file:./dev.db",

});

export const prisma = new PrismaClient({ adapter });

If you complete the Prisma ORM 7 upgrade before removing Accelerate, you can keep the Accelerate URL and extension temporarily. Do not pass the Accelerate URL to a driver adapter, because PrismaPg expects a direct database connection string and will fail with prisma:// or prisma+postgres://.

  1. Keep your Accelerate URL in .env (for example DATABASE_URL="prisma://..." or prisma+postgres://...).
  2. You can point prisma.config.ts directly to that same Accelerate URL for CLI operations:
title="prisma.config.ts"
import "dotenv/config";

import { defineConfig, env } from "prisma/config";

export default defineConfig({

  schema: "prisma/schema.prisma",

  datasource: {

    url: env("DATABASE_URL"),

  },

});
  • If you prefer a separate direct URL for migrations, you can still use DIRECT_DATABASE_URL as above, but it's optional for Accelerate users.
  1. Instantiate Prisma Client with the Accelerate URL and extension (no adapter):
import { PrismaClient } from "./generated/prisma/client";

import { withAccelerate } from "@prisma/extension-accelerate";

export const prisma = new PrismaClient({

  accelerateUrl: process.env.DATABASE_URL,

}).$extends(withAccelerate());

Remove this temporary integration before December 1, 2026 by following the transition guide that matches your database.

Since Prisma ORM v7 uses node-pg instead of the Rust-based query engine, SSL certificate defaults have changed. Previously, invalid SSL certificates were ignored. In v7, you may encounter the following error:

Error: P1010: User was denied access on the database <database>

To fix this, either keep the previous behavior:

const adapter = new PrismaPg({

  connectionString: process.env.DATABASE_URL,

  ssl: { rejectUnauthorized: false },

});

Or properly configure your database certificates using node --use-openssl-ca or by setting the NODE_EXTRA_CA_CERTS environment variable.

For more details, see GitHub issue #28795.

In Prisma ORM 7.0.0, environment variables are not loaded by default. Instead developers need to explicitly load the variables when calling the prisma CLI. Libraries like dotenv can be used to manage loading environment variables by reading the appropriate .env file.

title="bun"
bun add dotenv
pnpm
pnpm add dotenv
yarn
yarn add dotenv
npm
npm install dotenv

For bun users, no action is required as bun will automatically load .env files.

Prisma Config is now the default place for configuring how the Prisma CLI interacts with your database. You now configure your database URL, schema location, migration output, and custom seed scripts.

import "dotenv/config";

import { defineConfig, env } from "prisma/config";

export default defineConfig({

  // the main entry for your schema

  schema: "prisma/schema.prisma",

  // where migrations should be generated

  // what script to run for "prisma db seed"

  migrations: {

    path: "prisma/migrations",

    seed: "tsx prisma/seed.ts",

  },

  // The database URL

  datasource: {

    // Type Safe env() helper

    // Does not replace the need for dotenv

    url: env("DATABASE_URL"),

  },

});

The Metrics preview feature was deprecated in Prisma ORM 6.14.0 and has been removed for Prisma ORM 7.0.0. If you need this feature, you can use the underlying driver adapter for your database, or Client Extensions to make this information available.

For example, a basic totalQueries counter:

let total = 0;

const prisma = new PrismaClient().$extends({

  client: {

    $log: (s: string) => console.log(s),

    async $totalQueries() {

      return total;

    },

  },

  query: {

    $allModels: {

      async $allOperations({ query, args }) {

        total += 1;

        return query(args);

      },

    },

  },

});

async function main() {

  prisma.$log("Hello world");

  const totalQueries = await prisma.$totalQueries();

  console.log(totalQueries);

}

In Prisma ORM v7, the generated TypeScript enum values use the schema names, not the mapped values. This maintains compatibility with Prisma ORM v6 behavior.

Given this Prisma schema:

enum SuggestionStatus {

  PENDING  @map("pending")

  ACCEPTED @map("accepted")

  REJECTED @map("rejected")

}

In v6, the generated TypeScript enum was:

export const SuggestionStatus = {

  PENDING: "PENDING",

  ACCEPTED: "ACCEPTED",

  REJECTED: "REJECTED",

} as const;

In v7, the same schema generates the same TypeScript as v6:

export const SuggestionStatus = {

  PENDING: "PENDING",

  ACCEPTED: "ACCEPTED",

  REJECTED: "REJECTED",

} as const;

This means that SuggestionStatus.PENDING evaluates to "PENDING", not "pending". The mapping is handled at the database level only.

No migration is required for this change. The behavior now matches Prisma ORM v6, so existing code will continue to work as expected.

The client middleware API has been removed. If possible, use Client Extensions.

// ❌ Old (removed)

prisma.$use(async (params, next) => {

  // middleware logic

  return next(params);

});

// ✅ New (use extensions)

const prisma = new PrismaClient().$extends({

  query: {

    user: {

      async findMany({ args, query }) {

        // extension logic

        return query(args);

      },

    },

  },

});

In Prisma ORM v6 and earlier, running prisma migrate dev or prisma migrate reset would automatically execute your seed script after applying migrations. This automatic seeding behavior has been removed in Prisma ORM v7.

To seed your database in v7, you must explicitly run:

title="bun"
bunx prisma db seed
pnpm
pnpm prisma db seed
yarn
yarn prisma db seed
npm
npx prisma db seed

The --skip-generate flag was removed from prisma migrate dev and prisma db push. The --skip-seed flag was removed from prisma migrate dev.

migrate dev and db push no longer run prisma generate automatically. You must run prisma generate explicitly to generate Prisma Client.

The --schema and --url flags have been removed from the prisma db execute command. Previously, you could use --schema to specify the path to your Prisma schema file, or --url to specify the database URL directly. Now, the database connection must be configured in prisma.config.ts.

# Using --schema

prisma db execute --file ./script.sql --schema prisma/schema.prisma

# Using --url

prisma db execute --file ./script.sql --url "$DATABASE_URL"

Configure your database connection in prisma.config.ts instead:

import "dotenv/config";

import { defineConfig, env } from "prisma/config";

export default defineConfig({

  schema: "prisma/schema.prisma",

  datasource: {

    url: env("DATABASE_URL"),

  },

});

Then run the command without --schema or --url:

prisma db execute --file ./script.sql

Several options have been removed from prisma migrate diff and replaced with new options that use prisma.config.ts:

Removed Option Replacement
--from-url --from-config-datasource
--to-url --to-config-datasource
--from-schema-datasource --from-config-datasource
--to-schema-datasource --to-config-datasource
--shadow-database-url Configure in prisma.config.ts
prisma migrate diff \

  --from-url "$DATABASE_URL" \

  --to-schema schema.prisma \

  --script

Configure your database connection in prisma.config.ts, then use --from-config-datasource or --to-config-datasource:

prisma migrate diff \

  --from-config-datasource \

  --to-schema schema.prisma \

  --script

We've removed a small selection of Prisma-specific environment variables.

  • PRISMA_CLI_QUERY_ENGINE_TYPE
  • PRISMA_CLIENT_ENGINE_TYPE
  • PRISMA_QUERY_ENGINE_BINARY
  • PRISMA_QUERY_ENGINE_LIBRARY
  • PRISMA_GENERATE_SKIP_AUTOINSTALL
  • PRISMA_SKIP_POSTINSTALL_GENERATE
  • PRISMA_GENERATE_IN_POSTINSTALL
  • PRISMA_GENERATE_DATAPROXY
  • PRISMA_GENERATE_NO_ENGINE
  • PRISMA_CLIENT_NO_RETRY
  • PRISMA_MIGRATE_SKIP_GENERATE
  • PRISMA_MIGRATE_SKIP_SEED
Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu