# Hono (Prisma ORM v7) (/docs/guides/v7/frameworks/hono) > For the complete Prisma documentation index, see [llms.txt](https://www.prisma.io/docs/llms.txt). A markdown version of any docs page is available by appending `.md` to its URL. Learn how to use Prisma ORM in a Hono app Location: Guides > v7 > Frameworks > Hono ## Introduction [#introduction] [Hono](https://hono.dev/) is a small web framework that runs on Node.js, Cloudflare Workers, and other runtimes. Its route handlers are where you call Prisma ORM to read from a [Prisma Postgres](https://www.prisma.io/postgres) database. In this guide, you'll learn to integrate Prisma ORM with a Prisma Postgres database in a Hono backend application. You can find a complete example of this guide on [GitHub](https://github.com/prisma/prisma-examples/tree/latest/orm/hono). ## Quick start [#quick-start] Run one command to scaffold a Hono project with Prisma ORM and Prisma Postgres ready to go: #### bun ```bash bunx create-prisma@stable --template hono ``` #### pnpm ```bash pnpm create prisma@stable --template hono ``` #### yarn ```bash yarn create prisma@stable --template hono ``` #### npm ```bash npm create prisma@stable -- --template hono ``` Or follow the steps below to set it up manually. ## Prerequisites [#prerequisites] * [Node.js 20.19+ on 20.x, 22.12+ on 22.x, or 24+](https://nodejs.org) ## 1. Set up your project [#1-set-up-your-project] Create a new Hono project: #### bun ```bash bun create hono@latest ``` #### pnpm ```bash pnpm create hono@latest ``` #### yarn ```bash yarn create hono@latest ``` #### npm ```bash npm create hono@latest ``` > [!NOTE] > * *Target directory?* `my-app` > * *Which template do you want to use?* `nodejs` > * *Install dependencies? (recommended)* `Yes` > * *Which package manager do you want to use?* `npm` ## 2. Install and configure Prisma [#2-install-and-configure-prisma] ### 2.1. Install dependencies [#21-install-dependencies] To get started with Prisma, you'll need to install a few dependencies: #### bun ```bash bun add prisma@prev tsx @types/pg --dev ``` #### pnpm ```bash pnpm add prisma@prev tsx @types/pg --save-dev ``` #### yarn ```bash yarn add prisma@prev tsx @types/pg --dev ``` #### npm ```bash npm install prisma@prev tsx @types/pg --save-dev ``` #### bun ```bash bun add @prisma/client@7 @prisma/adapter-pg dotenv pg ``` #### pnpm ```bash pnpm add @prisma/client@7 @prisma/adapter-pg dotenv pg ``` #### yarn ```bash yarn add @prisma/client@7 @prisma/adapter-pg dotenv pg ``` #### npm ```bash npm install @prisma/client@7 @prisma/adapter-pg dotenv 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](https://www.prisma.io/docs/orm/v7/core-concepts/supported-databases/database-drivers). Once installed, initialize Prisma in your project: #### bun ```bash bunx --bun prisma init --output ../src/generated/prisma ``` #### pnpm ```bash pnpm prisma init --output ../src/generated/prisma ``` #### yarn ```bash yarn prisma init --output ../src/generated/prisma ``` #### npm ```bash npx prisma init --output ../src/generated/prisma ``` > [!NOTE] > `prisma init` creates the Prisma scaffolding and a local `DATABASE_URL`. In the next step, you will create a Prisma Postgres database and replace that value with a direct `postgres://...` connection string. This will create: * A `prisma/` directory with a `schema.prisma` file * A `prisma.config.ts` with your Prisma configuration * A `.env` file with a local `DATABASE_URL` already set Create a Prisma Postgres database and replace the generated `DATABASE_URL` in your `.env` file with the `postgres://...` connection string from the CLI output: #### bun ```bash bunx create-db ``` #### pnpm ```bash pnpm dlx create-db ``` #### yarn ```bash yarn dlx create-db ``` #### npm ```bash npx create-db ``` ### 2.2. Define your Prisma Schema [#22-define-your-prisma-schema] In the `prisma/schema.prisma` file, add the following models and change the generator to use the `prisma-client` provider: ```prisma title="prisma/schema.prisma" generator client { provider = "prisma-client" output = "../src/generated/prisma" } datasource db { provider = "postgresql" } model User { // [!code ++] id Int @id @default(autoincrement()) // [!code ++] email String @unique // [!code ++] name String? // [!code ++] posts Post[] // [!code ++] } // [!code ++] // [!code ++] model Post { // [!code ++] id Int @id @default(autoincrement()) // [!code ++] title String // [!code ++] content String? // [!code ++] published Boolean @default(false) // [!code ++] authorId Int // [!code ++] author User @relation(fields: [authorId], references: [id]) // [!code ++] } // [!code ++] ``` This creates two models: `User` and `Post`, with a one-to-many relationship between them. In `prisma.config.ts`, import `dotenv` at the top of the file ```typescript title="prisma.config.ts" import { defineConfig, env } from "prisma/config"; import "dotenv/config"; // [!code ++] export default defineConfig({ schema: "prisma/schema.prisma", migrations: { path: "prisma/migrations", }, datasource: { url: env("DATABASE_URL"), }, }); ``` ### 2.3. Configure the Prisma Client generator [#23-configure-the-prisma-client-generator] Now, run the following command to create the database tables and generate the Prisma Client: #### bun ```bash bunx prisma migrate dev --name init ``` #### pnpm ```bash pnpm prisma migrate dev --name init ``` #### yarn ```bash yarn prisma migrate dev --name init ``` #### npm ```bash npx prisma migrate dev --name init ``` #### bun ```bash bunx prisma generate ``` #### pnpm ```bash pnpm prisma generate ``` #### yarn ```bash yarn prisma generate ``` #### npm ```bash npx prisma generate ``` ### 2.4. Seed the database [#24-seed-the-database] Add some seed data to populate the database with sample users and posts. Create a new file called `seed.ts` in the `prisma/` directory: ```typescript title="prisma/seed.ts" import { PrismaClient, Prisma } from "../src/generated/prisma/client.js"; import { PrismaPg } from "@prisma/adapter-pg"; const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL!, }); const prisma = new PrismaClient({ adapter, }); const userData: Prisma.UserCreateInput[] = [ { name: "Alice", email: "alice@prisma.io", posts: { create: [ { title: "Join the Prisma Discord", content: "https://pris.ly/discord", published: true, }, { title: "Prisma on YouTube", content: "https://pris.ly/youtube", }, ], }, }, { name: "Bob", email: "bob@prisma.io", posts: { create: [ { title: "Follow Prisma on Twitter", content: "https://www.twitter.com/prisma", published: true, }, ], }, }, ]; export async function main() { for (const u of userData) { await prisma.user.create({ data: u }); } } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); }); ``` Now, tell Prisma how to run this script by updating your `prisma.config.ts`: ```typescript title="prisma.config.ts" import { defineConfig, env } from "prisma/config"; import "dotenv/config"; export default defineConfig({ schema: "prisma/schema.prisma", migrations: { path: "prisma/migrations", seed: "tsx prisma/seed.ts", // [!code ++] }, datasource: { url: env("DATABASE_URL"), }, }); ``` Run the seed script: #### bun ```bash bunx prisma db seed ``` #### pnpm ```bash pnpm prisma db seed ``` #### yarn ```bash yarn prisma db seed ``` #### npm ```bash npx prisma db seed ``` And open Prisma Studio to inspect your data: #### bun ```bash bunx prisma studio ``` #### pnpm ```bash pnpm prisma studio ``` #### yarn ```bash yarn prisma studio ``` #### npm ```bash npx prisma studio ``` ## 3. Integrate Prisma into Hono [#3-integrate-prisma-into-hono] ### 3.1. Create a Prisma middleware [#31-create-a-prisma-middleware] Inside of `/src`, create a `lib` directory and a `prisma.ts` file inside it. This file will be used to create and export your Prisma Client instance. Set up the Prisma client like this: ```tsx title="src/lib/prisma.ts" import type { Context, Next } from "hono"; import { PrismaClient } from "../generated/prisma/client.js"; import { PrismaPg } from "@prisma/adapter-pg"; import "dotenv/config"; const databaseUrl = process.env.DATABASE_URL; if (!databaseUrl) { throw new Error("DATABASE_URL is not set"); } const adapter = new PrismaPg({ connectionString: databaseUrl, }); const prisma = new PrismaClient({ adapter }); function withPrisma(c: Context, next: Next) { if (!c.get("prisma")) { c.set("prisma", prisma); } return next(); } export default withPrisma; ``` > [!WARNING] > We recommend using a connection pooler (like [Prisma Accelerate](https://www.prisma.io/accelerate)) to manage database connections efficiently. > > If you choose not to use one, in long-lived environments (for example, a Node.js server) instantiate a single `PrismaClient` and reuse it across requests to avoid exhausting database connections. In serverless environments or when using a pooler (for example, Accelerate), creating a client per request is acceptable. ### 3.2 Environment Variables & Types [#32-environment-variables--types] By default, Hono does not load any environment variables from a `.env`. `dotenv` handles this and will be read that file and expose them via `process.env`. Hono can get additional types to know that the `withPrisma` middleware will set a `prisma` key on the Hono context ```ts title="src/index.ts" import { Hono } from "hono"; import { serve } from "@hono/node-server"; import type { PrismaClient } from "./generated/prisma/client.js"; // [!code ++] type ContextWithPrisma = { // [!code ++] Variables: { // [!code ++] prisma: PrismaClient; // [!code ++] }; // [!code ++] }; // [!code ++] const app = new Hono(); // [!code highlight] app.get("/", (c) => { return c.text("Hello Hono!"); }); serve( { fetch: app.fetch, port: 3000, }, (info) => { console.log(`Server is running on http://localhost:${info.port}`); }, ); ``` If using Cloudflare Workers, the environment variables will automatically be set to Hono's context, so `dotenv` can be skipped. ### 3.3. Create a GET route [#33-create-a-get-route] Fetch data from the database using Hono's `app.get` function. This will perform any database queries and return the data as JSON. Create a new route inside of `src/index.ts`: Now, create a GET route that fetches the `Users` data from your database, making sure to include each user's `Posts` by adding them to the `include` field: ```ts title="src/index.ts" import withPrisma from "./lib/prisma.js"; app.get("/users", withPrisma, async (c) => { const prisma = c.get("prisma"); const users = await prisma.user.findMany({ include: { posts: true }, }); return c.json({ users }); }); ``` ### 3.4. Display the data [#34-display-the-data] Start the Hono app by call the `dev` script in the `package.json` #### bun ```bash bun run dev ``` #### pnpm ```bash pnpm run dev ``` #### yarn ```bash yarn dev ``` #### npm ```bash npm run dev ``` There should be a "Server is running on [http://localhost:3000](http://localhost:3000)" log printed out. From here, the data can be viewed by visiting `http://localhost:3000/users` or by running `curl` from the command line ```bash curl http://localhost:3000/users | jq ``` Your Hono app now serves users and their posts from a Prisma Postgres database. ## Next Steps [#next-steps] Now that you have a working Hono app connected to a Prisma Postgres database, you can: * Extend your Prisma schema with more models and relationships * Add create/update/delete routes and forms * Explore authentication and validation ### More Info [#more-info] * [Prisma Documentation](https://www.prisma.io/docs/orm/v7) * [Hono Documentation](https://hono.dev/docs/) ## Related pages - [`Astro`](https://www.prisma.io/docs/guides/v7/frameworks/astro): Learn how to use Prisma ORM in an Astro app - [`Elysia`](https://www.prisma.io/docs/guides/v7/frameworks/elysia): Learn how to use Prisma ORM in an Elysia app - [`NestJS`](https://www.prisma.io/docs/guides/v7/frameworks/nestjs): Learn how to use Prisma ORM in a NestJS app - [`Next.js`](https://www.prisma.io/docs/guides/v7/frameworks/nextjs): Learn how to use Prisma ORM in a Next.js app and deploy it to Vercel - [`Nuxt`](https://www.prisma.io/docs/guides/v7/frameworks/nuxt): A step-by-step guide to setting up and using Prisma ORM and Prisma Postgres in a Nuxt app