apps/docs/content/docs/orm/core-concepts/supported-databases/mysql.mdx
Prisma ORM supports MySQL and MariaDB databases, including self-hosted servers and serverless PlanetScale.
Configure the MySQL provider in your Prisma schema:
datasource db {
provider = "mysql"
}
Self-hosted MySQL/MariaDB:
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"), // mysql://user:pass@host:3306/db
},
});
PlanetScale:
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
datasource: {
url: env("DATABASE_URL"), // Uses connection string from PlanetScale
},
});
Use JavaScript database drivers via driver adapters:
With mariadb driver:
npm install @prisma/adapter-mariadb
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import { PrismaClient } from "./generated/prisma";
const adapter = new PrismaMariaDb({
host: "localhost",
port: 3306,
connectionLimit: 5,
});
const prisma = new PrismaClient({ adapter });
PlanetScale serverless:
npm install @prisma/adapter-planetscale undici
import { PrismaPlanetScale } from "@prisma/adapter-planetscale";
import { PrismaClient } from "./generated/prisma";
import { fetch as undiciFetch } from "undici"; // Only for Node.js <18
const adapter = new PrismaPlanetScale({
url: process.env.DATABASE_URL,
fetch: undiciFetch,
});
const prisma = new PrismaClient({ adapter });
Standard MySQL (5.6+) or MariaDB (10.0+) servers.
mysql://user:pass@host:3306/databaseprisma migrate dev for developmentmysql providerConnection string arguments:
| Argument | Default | Description |
|---|---|---|
connect_timeout | 5 | Seconds to wait for connection |
sslcert | Path to server certificate | |
sslidentity | Path to PKCS12 certificate | |
sslaccept | accept_invalid_certs | Certificate validation mode |
Serverless MySQL-compatible database built on Vitess clustering system.
aws.connect.psdb.cloudKey features:
Branch workflow:
Schema changes:
Use prisma db push (not prisma migrate):
npx prisma db push
PlanetScale generates its own schema diff when merging branches.
Referential integrity options:
Option 1: Emulate relations (recommended for default PlanetScale)
Set relationMode = "prisma" to handle relations in Prisma Client:
datasource db {
provider = "mysql"
relationMode = "prisma"
}
Add indexes on foreign keys manually:
model Post {
id Int @id @default(autoincrement())
title String
comments Comment[]
}
model Comment {
id Int @id @default(autoincrement())
postId Int
post Post @relation(fields: [postId], references: [id])
@@index([postId]) // Required when using relationMode = "prisma"
}
Option 2: Enable foreign key constraints
Enable foreign key constraints in PlanetScale settings to use standard relations without relationMode = "prisma".
Resources: PlanetScale docs • Prisma integration
| Prisma | MySQL/MariaDB |
|---|---|
String | VARCHAR(191) |
Boolean | TINYINT(1) |
Int | INT |
BigInt | BIGINT |
Float | DOUBLE |
Decimal | DECIMAL(65,30) |
DateTime | DATETIME(3) |
Json | JSON |
Bytes | LONGBLOB |
See full type mapping reference for complete details.
SSL connections:
DATABASE_URL="mysql://user:pass@host:3306/db?sslcert=./cert.pem&sslaccept=strict"
Unix socket connections:
DATABASE_URL="mysql://user:pass@localhost/db?socket=/var/run/mysqld/mysqld.sock"
PlanetScale sharding (Preview):
Define shard keys in your schema:
generator client {
provider = "prisma-client"
output = "./generated/prisma"
previewFeatures = ["shardKeys"]
}
model User {
id String @default(uuid())
region String @shardKey
}
Connection troubleshooting:
PlanetScale production branches are read-only for direct DDL. If you get error P3022, ensure you're:
prisma db push instead of prisma migrate