apps/docs/content/docs/orm/prisma-client/deployment/edge/deploy-to-cloudflare.mdx
:::info[Quick summary] This page covers everything you need to know to deploy an app with Prisma ORM to a Cloudflare Worker or to Cloudflare Pages. :::
<details> <summary>Questions answered in this page</summary>This section covers general things you need to be aware of when deploying to Cloudflare Workers or Pages and are using Prisma ORM, regardless of the database provider you use.
You can use Prisma Postgres and deploy to Cloudflare Workers.
After you create a Worker, run:
npx prisma@latest init --db
Enter a name for your project and choose a database region.
This command:
prisma directory containing a schema.prisma file for your database models..env file with your DATABASE_URL.When deploying a Cloudflare Worker that uses Prisma ORM, you need to use an edge-compatible driver and its respective driver adapter for Prisma ORM.
The edge-compatible drivers for Cloudflare Workers and Pages are:
node-postgres (pg) uses Cloudflare's connect() (TCP) to access the database@libsql/client is used to access Turso databases via HTTPThere's also work being done on the node-mysql2 driver which will enable access to traditional MySQL databases from Cloudflare Workers and Pages in the future as well.
If your application uses PostgreSQL, we recommend using Prisma Postgres. It is fully supported on edge runtimes and does not require a specialized edge-compatible driver. Review the Prisma Postgres serverless driver limitations to understand current constraints.
First, ensure that your datasource block in your Prisma schema is configured correctly. Database connection URLs are configured in prisma.config.ts:
datasource db {
provider = "postgresql" // this might also be `mysql` or another value depending on your database
}
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"),
},
});
When using your Worker in development, you can configure your database connection via the .dev.vars file locally.
Assuming you use the DATABASE_URL environment variable from above, you can set it inside .dev.vars as follows:
DATABASE_URL="your-database-connection-string"
In the above snippet, your-database-connection-string is a placeholder that you need to replace with the value of your own connection string, for example:
DATABASE_URL="postgresql://admin:[email protected]:5432/mydb"
Note that the .dev.vars file is not compatible with .env files which are typically used by Prisma ORM.
This means that you need to make sure that Prisma ORM gets access to the environment variable when needed, e.g. when running a Prisma CLI command like prisma migrate dev.
There are several options for achieving this:
dotenv to specify from where the CLI should read the environment variable, for example:
dotenv -e .dev.vars -- npx prisma migrate dev
package.json that reads .dev.vars via dotenv. You can then execute prisma commands as follows: npm run env -- npx prisma migrate dev. Here's a reference for the script:
"scripts": { "env": "dotenv -e .dev.vars" }
DATABASE_URL and any other relevant env vars into a new file called .env which can then be used by Prisma ORM.:::note
If you're using an approach that requires dotenv, you need to have the dotenv-cli package installed. You can do this e.g. by using this command to install the package locally in your project: npm install -D dotenv-cli.
:::
When deploying your Worker to production, you'll need to set the database connection using the wrangler CLI:
npx wrangler secret put DATABASE_URL
The command is interactive and will ask you to enter the value for the DATABASE_URL env var as the next step in the terminal.
:::note
This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not.
:::
Cloudflare has a size limit of 3 MB for Workers on the free plan. If your application bundle with Prisma ORM exceeds that size, we recommend upgrading to a paid Worker plan.
@cloudflare/next-on-pagesCloudflare offers an option to run Next.js apps on Cloudflare Pages with @cloudflare/next-on-pages, see the docs for instructions.
Based on some testing, we found the following:
pg don't work because pg itself currently does not work with @cloudflare/next-on-pages (see here).Feel free to reach out to us on Discord if you find that anything has changed about this.
This section provides database-specific instructions for deploying a Cloudflare Worker with Prisma ORM.
As a prerequisite for the following section, you need to have a Cloudflare Worker running locally and the Prisma CLI installed.
If you don't have that yet, you can run these commands:
npm create cloudflare@latest prisma-cloudflare-worker-example -- --type hello-world
cd prisma-cloudflare-worker-example
npm install prisma --save-dev && npm install @prisma/client
npx prisma init --output ../generated/prisma
You'll further need a database instance of your database provider of choice available. Refer to the respective documentation of the provider for setting up that instance.
We'll use the default User model for the example below:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
If you are using a traditional PostgreSQL database that's accessed via TCP and the pg driver, you need to:
@prisma/adapter-pg database adapter (learn more here)node_compat = true in wrangler.toml (see the Cloudflare docs):::note
If you don't have a project to deploy, follow the instructions in the Prerequisites to bootstrap a basic Cloudflare Worker with Prisma ORM in it.
:::
First, ensure that the database connection is configured properly. Database connection URLs are configured in prisma.config.ts:
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "postgresql"
}
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"),
},
});
Next, you need to set the DATABASE_URL environment variable to the value of your database connection string. You'll do this in a file called .dev.vars used by Cloudflare:
DATABASE_URL="postgresql://admin:[email protected]:5432/mydb"
Because the Prisma CLI by default is only compatible with .env files, you can adjust your package.json with the following script that loads the env vars from .dev.vars. You can then use this script to load the env vars before executing a prisma command.
Add this script to your package.json:
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
Now you can execute Prisma CLI commands as follows while ensuring that the command has access to the env vars in .dev.vars:
npm run env -- npx prisma
Next, install the required packages:
npm install @prisma/adapter-pg
node_compat = true in wrangler.tomlIn your wrangler.toml file, add the following line:
node_compat = true
:::note
For Cloudflare Pages, using node_compat is not officially supported. If you want to use pg in Cloudflare Pages, you can find a workaround here.
:::
If you ran npx prisma init above, you need to migrate your database schema to create the User table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step):
npm run env -- npx prisma migrate dev --name init
Here is a sample code snippet that you can use to instantiate PrismaClient and send a query to your database:
import { PrismaClient } from "./generated/client";
import { PrismaPg } from "@prisma/adapter-pg";
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaPg({ connectionString: env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
const users = await prisma.user.findMany();
const result = JSON.stringify(users);
ctx.waitUntil(prisma.$disconnect());
return new Response(result);
},
};
To run the Worker locally, you can run the wrangler dev command:
npx wrangler dev
DATABASE_URL environment variable and deploy the WorkerTo deploy the Worker, you first need to the DATABASE_URL environment variable via the wrangler CLI:
npx wrangler secret put DATABASE_URL
The command is interactive and will ask you to enter the value for the DATABASE_URL env var as the next step in the terminal.
:::note
This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not.
:::
Then you can go ahead then deploy the Worker:
npx wrangler deploy
The command will output the URL where you can access the deployed Worker.
If you are using a PlanetScale database, you need to:
use the @prisma/adapter-planetscale database adapter (learn more here)
manually remove the conflicting cache field:
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaPlanetScale({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init["cache"];
return fetch(url, init);
},
});
const prisma = new PrismaClient({ adapter });
// ...
},
};
:::note
If you don't have a project to deploy, follow the instructions in the Prerequisites to bootstrap a basic Cloudflare Worker with Prisma ORM in it.
:::
First, ensure that the database connection is configured properly. Database connection URLs are configured in prisma.config.ts:
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "mysql"
relationMode = "prisma" // required for PlanetScale (as by default foreign keys are disabled)
}
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"),
},
});
Next, you need to set the DATABASE_URL environment variable to the value of your database connection string. You'll do this in a file called .dev.vars used by Cloudflare:
DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:[email protected]/demo-cf-worker-ps?sslaccept=strict"
Because the Prisma CLI by default is only compatible with .env files, you can adjust your package.json with the following script that loads the env vars from .dev.vars. You can then use this script to load the env vars before executing a prisma command.
Add this script to your package.json:
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
Now you can execute Prisma CLI commands as follows while ensuring that the command has access to the env vars in .dev.vars:
npm run env -- npx prisma
Next, install the required packages:
npm install @prisma/adapter-planetscale
If you ran npx prisma init above, you need to migrate your database schema to create the User table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step):
npm run env -- npx prisma db push
Here is a sample code snippet that you can use to instantiate PrismaClient and send a query to your database:
import { PrismaClient } from "./generated/client";
import { PrismaPlanetScale } from "@prisma/adapter-planetscale";
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaPlanetScale({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init["cache"];
return fetch(url, init);
},
});
const prisma = new PrismaClient({ adapter });
const users = await prisma.user.findMany();
const result = JSON.stringify(users);
ctx.waitUntil(prisma.$disconnect());
return new Response(result);
},
};
To run the Worker locally, you can run the wrangler dev command:
npx wrangler dev
DATABASE_URL environment variable and deploy the WorkerTo deploy the Worker, you first need to the DATABASE_URL environment variable via the wrangler CLI:
npx wrangler secret put DATABASE_URL
The command is interactive and will ask you to enter the value for the DATABASE_URL env var as the next step in the terminal.
:::note
This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not.
:::
Then you can go ahead then deploy the Worker:
npx wrangler deploy
The command will output the URL where you can access the deployed Worker.
If you are using a Neon database, you need to:
@prisma/adapter-neon database adapter (learn more here):::note
If you don't have a project to deploy, follow the instructions in the Prerequisites to bootstrap a basic Cloudflare Worker with Prisma ORM in it.
:::
First, ensure that the database connection is configured properly. Database connection URLs are configured in prisma.config.ts:
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "postgresql"
}
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"),
},
});
Next, you need to set the DATABASE_URL environment variable to the value of your database connection string. You'll do this in a file called .dev.vars used by Cloudflare:
DATABASE_URL="postgresql://janedoe:[email protected]/neondb?sslmode=require"
Because the Prisma CLI by default is only compatible with .env files, you can adjust your package.json with the following script that loads the env vars from .dev.vars. You can then use this script to load the env vars before executing a prisma command.
Add this script to your package.json:
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
Now you can execute Prisma CLI commands as follows while ensuring that the command has access to the env vars in .dev.vars:
npm run env -- npx prisma
Next, install the required packages:
npm install @prisma/adapter-neon
If you ran npx prisma init above, you need to migrate your database schema to create the User table that's defined in your Prisma schema (if you already have all the tables you need in your database, you can skip this step):
npm run env -- npx prisma migrate dev --name init
Here is a sample code snippet that you can use to instantiate PrismaClient and send a query to your database:
import { PrismaClient } from "./generated/client";
import { PrismaNeon } from "@prisma/adapter-neon";
export default {
async fetch(request, env, ctx) {
const adapter = new PrismaNeon({ connectionString: env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
const users = await prisma.user.findMany();
const result = JSON.stringify(users);
ctx.waitUntil(prisma.$disconnect());
return new Response(result);
},
};
To run the Worker locally, you can run the wrangler dev command:
npx wrangler dev
DATABASE_URL environment variable and deploy the WorkerTo deploy the Worker, you first need to the DATABASE_URL environment variable via the wrangler CLI:
npx wrangler secret put DATABASE_URL
The command is interactive and will ask you to enter the value for the DATABASE_URL env var as the next step in the terminal.
:::note
This command requires you to be authenticated, and will ask you to log in to your Cloudflare account in case you are not.
:::
Then you can go ahead then deploy the Worker:
npx wrangler deploy
The command will output the URL where you can access the deployed Worker.
:::info[Using Cloudflare D1] For step-by-step instructions on using Prisma ORM with Cloudflare D1 (schema setup, migrations, and deploying your Worker), see the dedicated Cloudflare D1 deployment guide. :::