Skip to main content
Prisma Documentation Docs

Search documentation

Type to search this documentation.

On this pageOverview

Deploy to Deno Deploy

This guide shows how to build and deploy a small application to Deno Deploy. The application uses Prisma ORM to save a log of each request to a Prisma Postgres database.

This guide covers the use of Prisma CLI with Deno CLI, Deno Deploy, Prisma Client, and Prisma Postgres.

To start, you create a directory for your project, and then use deno run to initialize your application with prisma init as an npm package with npm specifiers.

To set up your application, open your terminal and navigate to a location of your choice. Then, run the following commands to set up your application:

title="bun"
mkdir prisma-deno-deploy

cd prisma-deno-deploy

bunx --bun prisma@6.19.3 init --db
pnpm
mkdir prisma-deno-deploy
cd prisma-deno-deploy
pnpm dlx prisma@6.19.3 init --db
yarn
mkdir prisma-deno-deploy
cd prisma-deno-deploy
yarn dlx prisma@6.19.3 init --db
npm
mkdir prisma-deno-deploy
cd prisma-deno-deploy
npx prisma@6.19.3 init --db

Enter a name for your project and choose a database region.

This command:

  • Connects your CLI to your Prisma Data Platform account. If you're not logged in or don't have an account, your browser will open to guide you through creating a new account or signing into your existing one.
  • Creates a prisma directory containing a schema.prisma file for your database models.
  • Creates a .env file with your DATABASE_URL (e.g., DATABASE_URL="postgresql://user:password@host:5432/database").

Edit the prisma/schema.prisma file to define a Log model, add a custom output path and the prisma-client generator with deno as the runtime:

title="schema.prisma"
generator client {

  provider        = "prisma-client-js"

  provider        = "prisma-client"

  output          = "../generated/prisma"

  runtime = "deno"

}

datasource db {

  provider = "postgresql"

}

model Log { 

  id      Int    @id @default(autoincrement()) 

  level   Level

  message String

  meta    Json

} 

enum Level { 

  Info 

  Warn 

  Error 

} 

Then, install Prisma Client and the Postgres adapter:

deno install npm:@prisma/client@6.19.3

deno install npm:@prisma/adapter-pg@6.19.3

Prisma Client does not read .env files by default on Deno, so you must also install dotenv-cli locally:

deno install npm:dotenv-cli

With the data model in place and your database connection configured, you can now apply the data model to your database.

deno run -A npm:prisma@6.19.3 migrate dev --name init

The command does two things:

  1. It creates a new SQL migration file for this migration
  2. It runs the SQL migration file against the database

At this point, the command has an additional side effects. The command installs Prisma Client and creates the package.json file for the project.

You can now create a local Deno application. Create index.ts in the root folder of your project and add the content below:

title="index.ts"
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";

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

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

const connectionString = `${Deno.env.get("DATABASE_URL")}`;

const adapter = new PrismaPg({ connectionString });

const prisma = new PrismaClient({ adapter });

async function handler(request: Request) {

  // Ignore /favicon.ico requests:

  const url = new URL(request.url);

  if (url.pathname === "/favicon.ico") {

    return new Response(null, { status: 204 });

  }

  const log = await prisma.log.create({

    data: {

      level: "Info",

      message: `${request.method} ${request.url}`,

      meta: {

        headers: JSON.stringify(request.headers),

      },

    },

  });

  const body = JSON.stringify(log, null, 2);

  return new Response(body, {

    headers: { "content-type": "application/json; charset=utf-8" },

  });

}

serve(handler);

You can now start your application locally and test the creation of log entries.

title="bun"
bunx dotenv -- deno run -A ./index.ts
pnpm
pnpm dlx dotenv -- deno run -A ./index.ts
yarn
yarn dlx dotenv -- deno run -A ./index.ts
npm
npx dotenv -- deno run -A ./index.ts

In a web browser, open http://localhost:8000/. This page writes your request to the database.

{

  "id": 1,

  "level": "Info",

  "message": "GET http://localhost:8000/",

  "meta": {

    "headers": "{}"

  }

}

Reload the page a few times.
Every time you reload, the script generates a new log entry and the id of the current log entry increments.

This confirms that your application works when you run it from your local environment.

You need a GitHub repository to add your project to Deno Deploy and enable automated deployments whenever you push changes.

To set up a GitHub repository:

  1. Create a private GitHub repository.

  2. Initialize your repository locally and push your changes to GitHub, with the following commands:

    git init -b main
    
    git remote add origin https://github.com/<username>/prisma-deno-deploy
    
    git add .
    
    git commit -m "initial commit"
    
    git push -u origin main

Use the GitHub repository to add your application to Deno Deploy:

  1. Go to https://dash.deno.com/.
  2. Select a GitHub organization or user and then select a repository.
  3. Select a production branch and select Fresh (Automatic) mode so that Deno Deploy can deploy every time you push a change to the repository.
  4. In the Build Step add deno run -A npm:prisma@6.19.3 generate to generate the Prisma Client.
  5. Select index.ts as the entry point to your project.
  6. Click Create & Deploy.

The deployment should fail as you have to add the DATABASE_URL environment variable.

Locate and navigate to the settings for the project.

  1. To define the database connection string, click Add Variable in the Environment Variables section.

    1. For KEY, enter DATABASE_URL.
    2. For VALUE, paste the database connection string.
  2. Click Save.

You have to add some code and create another commit to trigger a re-deployment.

Add the following code in your index.ts file:

title="index.ts"
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";

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

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

const connectionString = `${Deno.env.get("DATABASE_URL")}`;

const adapter = new PrismaPg({ connectionString });

const prisma = new PrismaClient({ adapter });

async function handler(request: Request) {

  // Ignore /favicon.ico requests:

  const url = new URL(request.url);

  if (url.pathname === "/favicon.ico") {

    return new Response(null, { status: 204 });

  }

  console.log("Request received."); 

  const log = await prisma.log.create({

    data: {

      level: "Info",

      message: `${request.method} ${request.url}`,

      meta: {

        headers: JSON.stringify(request.headers),

      },

    },

  });

  const body = JSON.stringify(log, null, 2);

  return new Response(body, {

    headers: { "content-type": "application/json; charset=utf-8" },

  });

}

serve(handler);

Commit the new changes:

git add .

git commit -m "add log"

git push origin main

This rebuilds the deployment, which now works because the environment variable has been added. After it completes, follow the URL in the deployment output. The application should show the same result as before, with a new, incremented log record ID:

{

  "id": 5,

  "level": "Info",

  "message": "GET https://prisma-deno-deploy.deno.dev/",

  "meta": {

    "headers": "{}"

  }

}

You successfully deployed a Deno application that you created in TypeScript, which uses Prisma Client with the Postgres adapter to connect to a Postgres database.

Suggest an edit

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

Export
Documentation menu