# Use Prisma Postgres with Bun (/guides/ecosystem/prisma-postgres)

<!-- agent-signals: reading_time_min: 3 · est_tokens: 1258 · updated: 2026-09-23 -->
Related: [Build an app with Astro and Bun](/guides/ecosystem/astro.md), [Create a Discord bot](/guides/ecosystem/discordjs.md), [Containerize a Bun application with Docker](/guides/ecosystem/docker.md), [Use Drizzle ORM with Bun](/guides/ecosystem/drizzle.md), [Use Gel with Bun](/guides/ecosystem/gel.md), [Build an HTTP server using Elysia and Bun](/guides/ecosystem/elysia.md)

<Steps>
  <Step title="Create a new project">
    First, create a directory and initialize it with `bun init`.

    ```bash icon="terminal" title="terminal" terminal
    mkdir prisma-postgres-app
    cd prisma-postgres-app
    bun init
    ```
  </Step>

  <Step title="Install Prisma dependencies">
    Then install the Prisma CLI (`prisma`), Prisma Client (`@prisma/client`), and the Postgres driver adapter (`@prisma/adapter-pg`) as dependencies.

    ```bash icon="terminal" title="terminal" terminal
    bun add -d prisma
    bun add @prisma/client @prisma/adapter-pg
    ```
  </Step>

  <Step title="Initialize Prisma with PostgreSQL">
    Use the Prisma CLI with `bunx` to initialize the schema and migration directory, with PostgreSQL as the database.

    ```bash icon="terminal" title="terminal" terminal
    bunx --bun prisma init --db
    ```

    This creates a basic schema. Update it to use the Rust-free client optimized for Bun: open `prisma/schema.prisma` and modify the generator block, then add a `User` model.

    ```prisma icon="/icons/ecosystem/prisma.svg" title="prisma/schema.prisma"
    generator client {
    	provider = "prisma-client"
    	output = "../generated/prisma" // [!code --]
    	output = "./generated" // [!code ++]
    	engineType = "client" // [!code ++]
    	runtime = "bun" // [!code ++]
    }

    datasource db {
    	provider = "postgresql"
    }

    model User { // [!code ++]
    	id    Int     @id @default(autoincrement()) // [!code ++]
    	email String  @unique // [!code ++]
    	name  String? // [!code ++]
    } // [!code ++]
    ```
  </Step>

  <Step title="Configure database connection">
    Set up your Postgres database URL in the `.env` file.

    ```ini icon="settings" title=".env"
    DATABASE_URL="postgresql://username:password@localhost:5432/mydb?schema=public"
    ```
  </Step>

  <Step title="Create and run database migration">
    Then generate and run the initial migration.

    The command writes a `.sql` migration file to `prisma/migrations` and executes it against your Postgres database. Bun [does not load `.env` automatically](/runtime/environment-variables) when it runs a CLI with `--bun`. The `prisma.config.ts` generated by `prisma init` reads `DATABASE_URL` from the environment, so pass `--env-file=.env` explicitly.

    ```bash icon="terminal" title="terminal" terminal
    bun run --bun --env-file=.env prisma migrate dev --name init
    ```

    ```txt
    Loaded Prisma config from prisma.config.ts.

    Prisma schema loaded from prisma/schema.prisma.
    Datasource "db": PostgreSQL database "mydb", schema "public" at "localhost:5432"

    Applying migration `20250114141233_init`

    The following migration(s) have been created and applied from new schema changes:

    prisma/migrations/
      └─ 20250114141233_init/
        └─ migration.sql

    Your database is now in sync with your schema.
    ```
  </Step>

  <Step title="Generate Prisma Client">
    `prisma migrate dev` does not generate the *Prisma client*, so generate it with the Prisma CLI. The client provides a fully typed API for reading and writing to the database.

    ```sh icon="terminal" title="terminal" terminal
    bun run --bun --env-file=.env prisma generate
    ```
  </Step>

  <Step title="Initialize Prisma Client with the Postgres adapter">
    Create a new file `prisma/db.ts` that initializes the PrismaClient with the Postgres adapter.

    ```ts icon="/icons/typescript.svg" title="prisma/db.ts"
    import { PrismaClient } from "./generated/client";
    import { PrismaPg } from "@prisma/adapter-pg";

    const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL! });
    export const prisma = new PrismaClient({ adapter });
    ```
  </Step>

  <Step title="Create a test script">
    Write a script that creates a new user, then counts the users in the database.

    ```ts icon="/icons/typescript.svg" title="index.ts"
    import { prisma } from "./prisma/db";

    // create a new user
    await prisma.user.create({
      data: {
        name: "John Dough",
        email: `john-${Math.random()}@example.com`,
      },
    });

    // count the number of users
    const count = await prisma.user.count();
    console.log(`There are ${count} users in the database.`);
    ```
  </Step>

  <Step title="Run and test the application">
    Run the script with `bun run`. Each run creates a new user.

    ```bash icon="terminal" title="terminal" terminal
    bun run index.ts
    ```

    ```txt
    There are 1 users in the database.
    ```

    ```bash icon="terminal" title="terminal" terminal
    bun run index.ts
    ```

    ```txt
    There are 2 users in the database.
    ```

    ```bash icon="terminal" title="terminal" terminal
    bun run index.ts
    ```

    ```txt
    There are 3 users in the database.
    ```
  </Step>
</Steps>

***

Prisma Postgres is now set up with Bun. Refer to the [official Prisma Postgres docs](https://www.prisma.io/docs/postgres) as you continue to develop your application.
