Bun
Bun is a fast JavaScript runtime that includes a bundler, test runner, and package manager. In this guide, you will set up a Bun project with Prisma ORM and a Prisma Postgres database. You will create a small HTTP server and build a Bun executable for deployment.
https://www.youtube.com/embed/gE6l4eX0v_I
- Bun installed in your system
- A Prisma Postgres database (created during setup)
- Basic knowledge of JavaScript/TypeScript
First, create a directory for your project and navigate to it:
mkdir bun-prisma
cd bun-prismaThen, initialise a new Bun project:
bun initpnpm inityarn initnpm initThis creates a basic Bun project that includes a package.json file and an index.ts file.
Install the required Prisma packages and other dependencies:
bun add prisma@prev @types/pg --dev
bun add @prisma/client@7 @prisma/adapter-pg pgpnpm add prisma@prev @types/pg --save-dev
pnpm add @prisma/client@7 @prisma/adapter-pg pgyarn add prisma@prev @types/pg --dev
yarn add @prisma/client@7 @prisma/adapter-pg pgnpm install prisma@prev @types/pg --save-dev
npm install @prisma/client@7 @prisma/adapter-pg pg[!NOTE] If you are using a different database provider (MySQL, SQL Server, SQLite), install the corresponding driver adapter package instead of
@prisma/adapter-pg. For more information, see Database drivers.
2.2. Initialize Prisma ORM with Prisma Postgres
Section titled “2.2. Initialize Prisma ORM with Prisma Postgres”Initialize Prisma ORM with Prisma Postgres in your project:
bunx --bun prisma initpnpm prisma inityarn prisma initnpx prisma init[!NOTE] When using the Bun tab for
prisma init, the--bunflag ensures Prisma runs with the Bun runtime instead of falling back to Node.js due to the#!/usr/bin/env nodeshebang in the CLI.
[!NOTE]
prisma initcreates the Prisma scaffolding and a localDATABASE_URL. In the next step, you will create a Prisma Postgres database and replace that value with a directpostgres://...connection string.
This command creates:
- A
prisma/directory with yourschema.prismafile - A
prisma.config.tsfile - A
.envfile with yourDATABASE_URL
This command creates:
- A
prisma/directory with yourschema.prismafile - A
prisma.config.tsfile - A
.envfile with yourDATABASE_URL
Create a Prisma Postgres database and replace the generated DATABASE_URL in your .env file with the postgres://... connection string from the CLI output:
bunx create-dbpnpm dlx create-dbyarn dlx create-dbnpx create-dbUpdate your .env file:
DATABASE_URL="postgres://..."Open prisma/schema.prisma and update it to include your data model:
generator client {
provider = "prisma-client"
output = "../generated/prisma"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
} 3. Generate Prisma Client and run migrations
Section titled “3. Generate Prisma Client and run migrations”Generate the Prisma client and apply your schema to the database:
bunx prisma migrate dev --name init
bunx prisma generatepnpm prisma migrate dev --name init
pnpm prisma generateyarn prisma migrate dev --name init
yarn prisma generatenpx prisma migrate dev --name init
npx prisma generateThis command:
- Creates the database tables based on your schema
- Generates the Prisma client in the
generated/prismadirectory
4. Setting up database configuration and creating a seed script
Section titled “4. Setting up database configuration and creating a seed script”Create a db.ts file in your project root to configure PrismaClient:
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,
});Create a seed script in the prisma folder to populate your database with sample data:
import { PrismaClient } from "../generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL!,
});
const prisma = new PrismaClient({
adapter,
});
async function main() {
// Create multiple users
await prisma.user.createMany({
data: [
{ email: "alice@example.com", name: "Alice" },
{ email: "bob@example.com", name: "Bob" },
{ email: "charlie@example.com", name: "Charlie" },
{ email: "diana@example.com", name: "Diana" },
{ email: "eve@example.com", name: "Eve" },
{ email: "frank@example.com", name: "Frank" },
{ email: "grace@example.com", name: "Grace" },
{ email: "henry@example.com", name: "Henry" },
{ email: "isabella@example.com", name: "Isabella" },
{ email: "jack@example.com", name: "Jack" },
],
skipDuplicates: true, // prevents errors if you run the seed multiple times
});
console.log("Seed data inserted!");
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});Add the following content to the file:
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
seed: `bun run prisma/seed.ts`,
},
datasource: {
url: env("DATABASE_URL"),
},
});Run the seed script to populate your database:
bunx prisma db seedpnpm prisma db seedyarn prisma db seednpx prisma db seedReplace the index.ts file contents with the following code to build a small HTTP server that uses Prisma ORM to fetch and display users:
import { prisma } from "./db";
const server = Bun.serve({
port: 3000,
async fetch(req) {
const { pathname } = new URL(req.url);
// Skip favicon route
if (pathname === "/favicon.ico") {
return new Response(null, { status: 204 }); // or serve an icon if you have one
}
// Return all users
const users = await prisma.user.findMany();
// Count all users
const count = await prisma.user.count();
// Format the response with JSON
return new Response(
JSON.stringify({
users: users,
totalUsers: count,
}),
{ headers: { "Content-Type": "application/json" } },
);
},
});
console.log(`Listening on http://localhost:${server.port}`);Start your Bun server:
bun run index.tsYou should see Listening on http://localhost:3000 in the console. When you visit http://localhost:3000 in your browser, you'll see a JSON response with all the users in your database and the total count.
Bun can compile your TypeScript application into a single executable file, which is useful for deployment and distribution.
Build your application into an executable:
bun build --compile index.tsThis creates an executable file named index (or index.exe on Windows) in your project directory.
Run the compiled executable:
./indexYou should see the same Listening on http://localhost:3000 message, and your application will work exactly the same as before. The executable includes all dependencies and can be deployed to any compatible system without requiring Bun or Node.js to be installed.
You can explore this example to see a sample application built with Bun and Prisma.
Now that you have a Bun application connected to a Prisma Postgres database, you can continue by:
- Extending your Prisma schema with additional models and relationships
- Implementing authentication and authorization
- Adding input validation and error handling
- Exploring Bun's built-in testing tools
- Deploying your executable to production servers