PostgreSQL
Prisma ORM supports PostgreSQL and PostgreSQL-compatible databases including self-hosted PostgreSQL, serverless providers (Neon, Supabase), and CockroachDB.
Configure the provider in your Prisma schema:
datasource db {
provider = "postgresql" // or "cockroachdb" for CockroachDB
}Self-hosted PostgreSQL:
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"), // postgres://user:pass@host:5432/db
},
});Serverless (Neon/Supabase):
Use separate URLs for CLI (direct) and runtime (pooled):
DATABASE_URL="postgres://user:pass@host-pooler:6543/db?pgbouncer=true"
DIRECT_URL="postgres://user:pass@host:5432/db"import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DIRECT_URL"), // CLI uses direct connection
},
});Use JavaScript database drivers via driver adapters:
Standard PostgreSQL with pg:
bun add @prisma/adapter-pgpnpm add @prisma/adapter-pgyarn add @prisma/adapter-pgnpm install @prisma/adapter-pgimport { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./generated/prisma";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });DATABASE_URL has to be set in the process environment when this code runs. Node.js does not read .env files on its own, so install dotenv and add import "dotenv/config"; at the top of your entry file, or start Node with its --env-file flag. If the variable is missing, pg gets no connection string and falls back to its defaults, and the usual symptom is SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string.
Neon serverless:
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./generated/prisma";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });DATABASE_URL has to be set in the process environment when this code runs. Node.js does not read .env files on its own, so install dotenv and add import "dotenv/config"; at the top of your entry file, or start Node with its --env-file flag. If the variable is missing, pg gets no connection string and falls back to its defaults, and the usual symptom is SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string.
Neon serverless:
bun add @prisma/adapter-neonpnpm add @prisma/adapter-neonyarn add @prisma/adapter-neonnpm install @prisma/adapter-neonimport { PrismaNeon } from "@prisma/adapter-neon";
import { PrismaClient } from "./generated/prisma";
const adapter = new PrismaNeon({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });import { PrismaNeon } from "@prisma/adapter-neon";
import { PrismaClient } from "./generated/prisma";
const adapter = new PrismaNeon({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });Standard PostgreSQL server (9.6+).
- Connection URL:
postgresql://user:pass@host:5432/database - Full Prisma Migrate support
- Use
prisma migrate devfor development - TLS/SSL configuration via connection string parameters
Connection string arguments:
| Argument | Default | Description |
|---|---|---|
schema |
public |
PostgreSQL schema to use |
connect_timeout |
5 |
Seconds to wait for connection (0 = no timeout) |
sslmode |
prefer |
TLS mode: prefer, disable, require |
sslcert |
Path to server certificate | |
sslidentity |
Path to PKCS12 certificate |
Serverless PostgreSQL with automatic scaling and branching.
- Connection URL:
postgres://user:pass@host-pooler.region.aws.neon.tech:5432/db - Add
-poolerto hostname for connection pooling (PgBouncer, 10k connections) - Compute scales to zero after 5 minutes inactivity
- Cold start: 500ms - few seconds
- Database branching for development workflows
Timeout configuration: Configure connection and pool timeouts via your driver adapter (e.g. connectionTimeoutMillis for pg).
Resources: Neon docs • Connection pooling
PostgreSQL hosting with built-in auth, storage, and real-time features.
Connection types:
- Direct:
db.[project-ref].supabase.co:5432 - Transaction pooler: Port
6543with?pgbouncer=true - Session pooler: Port
5432on pooler host
Key features:
- Supavisor connection pooling
- Built-in PostgreSQL extensions
- Integrated with Supabase ecosystem
- Automated backups
Resources: Supabase docs • Prisma integration
Distributed, PostgreSQL-compatible database designed for scalability and high availability.
- Use
provider = "cockroachdb"in schema - Connection URL:
postgresql://user:pass@host:26257/database - Built-in replication and automated failover
- Horizontal scaling with no single point of failure
Key differences:
| Feature | PostgreSQL | CockroachDB |
|---|---|---|
| Native types | VARCHAR(n) |
STRING(n) |
| ID generation | autoincrement() |
Uses unique_rowid() |
| Sequential IDs | Recommended | Avoid (use autoincrement() instead) |
ID generation example:
model User {
id BigInt @id @default(autoincrement()) // Uses unique_rowid()
name String
}For compatibility with existing databases, use sequence():
model User {
id Int @id @default(sequence())
name String
}Resources: CockroachDB docs • Primary key best practices
| Prisma | PostgreSQL | CockroachDB |
|---|---|---|
String |
text |
STRING |
Boolean |
boolean |
BOOL |
Int |
integer |
INT4 |
BigInt |
bigint |
INT8 |
Float |
double precision |
FLOAT8 |
Decimal |
decimal(65,30) |
DECIMAL |
DateTime |
timestamp(3) |
TIMESTAMP |
Json |
jsonb |
JSONB |
Bytes |
bytea |
BYTES |
See full type mapping reference for complete details.
SSL connections:
DATABASE_URL="postgresql://user:pass@host:5432/db?sslmode=require&sslcert=./cert.pem"sslmode=prefer(default) - Use TLS if availablesslmode=require- Require TLS or failsslmode=disable- No TLS
Socket connections:
DATABASE_URL="postgresql://user:pass@localhost/db?host=/var/run/postgresql/"Specifying schema with driver adapters:
const adapter = new PrismaPg(
{ connectionString: process.env.DATABASE_URL },
{ schema: "mySchema" }
);Connection pool defaults (Prisma ORM v7):
Driver adapters use pg defaults which differ from v6:
- Connection timeout:
0(no timeout) vs v6's5s - Idle timeout:
10svs v6's300s
See connection pool guide for configuration.