Files
Saxon FletcherandClaude Opus 5 32341830b3 docs: organize observability by task and move SQL logs to Explorer (#50074)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

Yes.

## What kind of change does this PR introduce?

Documentation update.

## What is the current behavior?

The observability overview and access page overlap; configuration
interrupts querying; related guides send log queries to the old editor.

## What is the new behavior?

The observability overview and navigation follow the same four sections:
Read project data, Detect and diagnose, Hire an agent, and Configure and
export. The overview absorbs the redundant access page, with permanent
redirects for both HTML and Markdown URLs.

“Query logs with SQL” owns ClickHouse querying through MCP, the
Management API, and Explorer with query source Logs. Logging
configuration moves to its own guide; sources, captured headers, and
limits live in the field reference. Inspection links to canonical
diagnostic SQL. Related Storage and database guides use the replacement
Explorer workflow and retain existing anchors where headings move.

## Additional context

Validation: Markdown generation, docs typecheck, targeted ESLint,
formatting, and content-listing tests. Browser overview/navigation
checked; old HTML and Markdown URLs return 308, and the new
configuration page returns 200 in both formats. Three ClickHouse
examples and the Postgres configuration query ran in a disposable
container sandbox. Changed pages have no MDX lint violations;
repository-wide existing failures remain.

Self-review: the Management API request was verified against its
published schema but not sent to a hosted project. Realtime ingestion
and hosted logging configuration still need a hosted smoke check. No
compatibility path for the deprecated logs engine is documented.

Stage 2 of 3; depends on stage 1.


Stack: #50073 → #50074 → #50075.

Production docs build also passes at the stack tip after standard
reference generation.



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **Documentation**
- Reorganized observability guidance around reading data, detecting
issues, diagnosing problems, agent setup, and exporting data.
  - Added a guide for configuring Postgres and Realtime logging.
- Updated log investigation instructions to use Explorer, SQL queries,
and clearer filters.
  - Added log source, field, and captured-header references.
  - Improved advisor guidance and database performance troubleshooting.
  - Added redirects for moved observability content.

- **Accessibility**
- Improved screen-reader labels for copy and feature-selection controls.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 17:03:43 +10:00

471 lines
16 KiB
Plaintext

---
id: 'prisma'
title: 'Prisma'
description: 'Prisma Quickstart'
breadcrumb: 'ORM Quickstarts'
hideToc: true
---
This guide shows how to connect your Prisma application to Supabase Postgres. If you encounter any problems, reference the [Prisma troubleshooting docs](/docs/guides/database/prisma/prisma-troubleshooting).
<Admonition type="note">
If you plan to solely use Prisma instead of the Supabase Data API (PostgREST), turn it off in the [API Settings](/dashboard/project/_/settings/api).
</Admonition>
<StepHikeCompact>
<StepHikeCompact.Step step={1}>
<StepHikeCompact.Details title="Create a custom user for Prisma">
- In the [SQL Editor](/dashboard/project/_/sql/new), create a Prisma DB user with full privileges on the public schema.
- This gives you better control over Prisma's access and makes it easier to monitor using Supabase tools like the [Query Performance Dashboard](/dashboard/project/_/advisors/query-performance) and [Logs](/dashboard/project/_/logs).
<Admonition type="note" title="Password manager">
For security, consider using a [password generator](https://bitwarden.com/password-generator/) for the Prisma role.
</Admonition>
</StepHikeCompact.Details>
<StepHikeCompact.Code>
```sql
-- Create custom user
create user "prisma" with password 'custom_password' bypassrls createdb;
-- extend prisma's privileges to postgres (necessary to view changes in Dashboard)
grant "prisma" to "postgres";
-- Grant it necessary permissions over the relevant schemas (public)
grant usage on schema public to prisma;
grant create on schema public to prisma;
grant all on all tables in schema public to prisma;
grant all on all routines in schema public to prisma;
grant all on all sequences in schema public to prisma;
alter default privileges for role postgres in schema public grant all on tables to prisma;
alter default privileges for role postgres in schema public grant all on routines to prisma;
alter default privileges for role postgres in schema public grant all on sequences to prisma;
```
```sql
-- alter prisma password if needed
alter user "prisma" with password 'new_password';
```
</StepHikeCompact.Code>
</StepHikeCompact.Step>
<StepHikeCompact.Step step={2}>
<StepHikeCompact.Details title="Create a Prisma Project">
Create a new Prisma Project on your computer
</StepHikeCompact.Details>
<StepHikeCompact.Code>
Create a new directory
```bash Terminal
mkdir hello-prisma
cd hello-prisma
```
Initiate a new Prisma project
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="npm_initiate"
queryGroup="initiate"
>
<TabPanel id="npm_initiate" label="npm">
```bash
npm init -y
npm install prisma tsx @types/pg --save-dev
npm install @prisma/client @prisma/adapter-pg dotenv pg
npx tsc --init
npx prisma init
```
</TabPanel>
<TabPanel id="pnpm_initiate" label="pnpm">
```bash
pnpm init
pnpm install prisma tsx @types/pg --save-dev
pnpm install @prisma/client @prisma/adapter-pg dotenv pg
pnpx tsc --init
pnpx prisma init
```
</TabPanel>
<TabPanel id="yarn_initiate" label="yarn">
```bash
yarn init -y
yarn add prisma tsx @types/pg --save-dev
yarn add @prisma/client @prisma/adapter-pg dotenv pg
yarn tsc --init
yarn prisma init
```
</TabPanel>
<TabPanel id="bun_initiate" label="bun">
```bash
bun init -y
bun install prisma tsx @types/pg --save-dev
bun install @prisma/client @prisma/adapter-pg dotenv pg
bunx tsc --init
bunx prisma init
```
</TabPanel>
</Tabs>
</StepHikeCompact.Code>
</StepHikeCompact.Step>
<StepHikeCompact.Step step={3}>
<StepHikeCompact.Details title="Add your connection information to your .env file">
- On your project dashboard, click [Connect](/dashboard/project/_?showConnect=true)
- Find your Supavisor Session pooler string. It should end with 5432. It will be used in your `.env` file.
<Admonition type="note">
If you're in an [IPv6 environment](https://github.com/orgs/supabase/discussions/27034) or have the IPv4 Add-On, you can use the direct connection string instead of Supavisor in Session mode.
</Admonition>
- If you plan on deploying Prisma to a serverless or auto-scaling environment, you'll also need your Supavisor transaction mode string.
- The string is identical to the session mode string but uses port 6543 at the end.
</StepHikeCompact.Details>
<StepHikeCompact.Code>
<Tabs type="underlined" size="small">
<TabPanel id="serverful" label="server-based deployments">
In your .env file, set the DATABASE_URL variable to your connection string
```text .env
# Used for Prisma Migrations and within your application
DATABASE_URL="postgres://[DB-USER].[PROJECT-REF]:[PRISMA-PASSWORD]@[DB-REGION].pooler.supabase.com:5432/postgres"
```
Change your string's `[DB-USER]` to `prisma` and add the password you created in step 1
```md
postgres://prisma.[PROJECT-REF]...
```
</TabPanel>
<TabPanel id="serverless" label="serverless deployments">
Assign the connection string for Supavisor Transaction Mode (using port 6543) to the DATABASE_URL variable in your .env file. Make sure to append "pgbouncer=true" to the end of the string to work with Supavisor.
Next, create a DIRECT_URL variable in your .env file and assign the connection string that ends with port 5432 to it.
```text .env # Used in your application (use transaction mode)
DATABASE_URL="postgres://[DB-USER].[PROJECT-REF]:[PRISMA-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:6543/postgres?pgbouncer=true"
# Used for Prisma Migrations (use session mode or direct connection)
DIRECT_URL="postgres://[DB-USER].[PROJECT-REF]:[PRISMA-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres"
```
Change both your strings' `[DB-USER]` to `prisma` and then add the password created in step 1
```md
postgres://prisma.[PROJECT-REF]...
```
</TabPanel>
</Tabs>
</StepHikeCompact.Code>
</StepHikeCompact.Step>
<StepHikeCompact.Step step={4}>
<StepHikeCompact.Details title="Configure prisma.config.ts">
Add `import "dotenv/config"` to the generated `prisma.config.ts`. If you are using a serverless environment, change the data source URL to `DIRECT_URL`.
</StepHikeCompact.Details>
<StepHikeCompact.Code>
<Tabs type="underlined" size="small">
<TabPanel id="serverful" label="server-based deployments">
```ts prisma.config.ts
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: env("DATABASE_URL"),
},
});
```
</TabPanel>
<TabPanel id="serverless" label="serverless deployments">
```ts prisma.config.ts
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: env("DIRECT_URL"),
},
});
```
</TabPanel>
</Tabs>
</StepHikeCompact.Code>
</StepHikeCompact.Step>
<StepHikeCompact.Step step={5}>
<StepHikeCompact.Details title="Migrate and generate your Prisma client">
If you have already modified your Supabase database, synchronize it with your migration file. Otherwise create new tables for your database, then generate the Prisma client.
</StepHikeCompact.Details>
<StepHikeCompact.Code>
<Tabs type="underlined" size="small">
<TabPanel id="new-projects" label="New Projects">
Create new tables in your prisma.schema file
```ts prisma/schema.prisma
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
```
commit your migration
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="npm_migrate"
queryGroup="migrate"
>
<TabPanel id="npm_migrate" label="npm">
```bash
npx prisma migrate dev --name first_prisma_migration
npx prisma generate
```
</TabPanel>
<TabPanel id="pnpm_migrate" label="pnpm">
```bash
pnpx prisma migrate dev --name first_prisma_migration
pnpx prisma generate
```
</TabPanel>
<TabPanel id="yarn_migrate" label="yarn">
```bash
yarn prisma migrate dev --name first_prisma_migration
yarn prisma generate
```
</TabPanel>
<TabPanel id="bun_migrate" label="bun">
```bash
bunx prisma migrate dev --name first_prisma_migration
bunx prisma generate
```
</TabPanel>
</Tabs>
</TabPanel>
<TabPanel id="established-projects" label="Populated Projects">
Synchronize changes from your project:
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="npm_sync"
queryGroup="sync"
>
<TabPanel id="npm_sync" label="npm">
```bash
npx prisma db pull
```
Create a migration file
```bash
mkdir -p prisma/migrations/0_init_supabase
```
Synchronize the migrations
```bash
npx prisma migrate diff \
--from-empty \
--to-schema prisma/schema.prisma \
--script > prisma/migrations/0_init_supabase/migration.sql
```
<Admonition type="note" title="Conflict management">
If there are any conflicts, reference [Prisma's official doc](https://www.prisma.io/docs/orm/prisma-migrate/getting-started#work-around-features-not-supported-by-prisma-schema-language) or the [trouble shooting guide](/docs/guides/database/prisma/prisma-troubleshooting) for more details
</Admonition>
```bash
npx prisma migrate resolve --applied 0_init_supabase
npx prisma generate
```
</TabPanel>
<TabPanel id="pnpm_sync" label="pnpm">
```bash
pnpx prisma db pull
```
Create a migration file
```bash
mkdir -p prisma/migrations/0_init_supabase
```
Synchronize the migrations
```bash
pnpx prisma migrate diff \
--from-empty \
--to-schema prisma/schema.prisma \
--script > prisma/migrations/0_init_supabase/migration.sql
```
<Admonition type="note" title="Conflict management">
If there are any conflicts, reference [Prisma's official doc](https://www.prisma.io/docs/orm/prisma-migrate/getting-started#work-around-features-not-supported-by-prisma-schema-language) or the [trouble shooting guide](/docs/guides/database/prisma/prisma-troubleshooting) for more details
</Admonition>
```bash
pnpx prisma migrate resolve --applied 0_init_supabase
pnpx prisma generate
```
</TabPanel>
<TabPanel id="yarn_sync" label="yarn">
```bash
yarn prisma db pull
```
Create a migration file
```bash
mkdir -p prisma/migrations/0_init_supabase
```
Synchronize the migrations
```bash
yarn prisma migrate diff \
--from-empty \
--to-schema prisma/schema.prisma \
--script > prisma/migrations/0_init_supabase/migration.sql
```
<Admonition type="note" title="Conflict management">
If there are any conflicts, reference [Prisma's official doc](https://www.prisma.io/docs/orm/prisma-migrate/getting-started#work-around-features-not-supported-by-prisma-schema-language) or the [trouble shooting guide](/docs/guides/database/prisma/prisma-troubleshooting) for more details
</Admonition>
```bash
yarn prisma migrate resolve --applied 0_init_supabase
yarn prisma generate
```
</TabPanel>
<TabPanel id="bun_sync" label="bun">
```bash
bunx prisma db pull
```
Create a migration file
```bash
mkdir -p prisma/migrations/0_init_supabase
```
Synchronize the migrations
```bash
bunx prisma migrate diff \
--from-empty \
--to-schema prisma/schema.prisma \
--script > prisma/migrations/0_init_supabase/migration.sql
```
<Admonition type="note" title="Conflict management">
If there are any conflicts, reference [Prisma's official doc](https://www.prisma.io/docs/orm/prisma-migrate/getting-started#work-around-features-not-supported-by-prisma-schema-language) or the [trouble shooting guide](/docs/guides/database/prisma/prisma-troubleshooting) for more details
</Admonition>
```bash
bunx prisma migrate resolve --applied 0_init_supabase
bunx prisma generate
```
</TabPanel>
</Tabs>
</TabPanel>
</Tabs>
</StepHikeCompact.Code>
</StepHikeCompact.Step>
<StepHikeCompact.Step step={6}>
<StepHikeCompact.Details title="Test your API">
Create a index.ts file and run it to test your connection
</StepHikeCompact.Details>
<StepHikeCompact.Code>
```ts index.ts
import "dotenv/config";
import { PrismaClient } from "./generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
export const prisma = new PrismaClient({ adapter });
async function main() {
const val = await prisma.user.findMany({
take: 10,
});
console.log(val);
}
main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
process.exit(1);
});
```
</StepHikeCompact.Code>
</StepHikeCompact.Step>
</StepHikeCompact>