mirror of
https://github.com/supabase/supabase.git
synced 2026-05-11 10:49:48 +08:00
* fix: rewrite relative URLs when syncing to GitHub discussion Relative URLs back to supabse.com won't work in GitHub discussions, so rewrite them back to absolute URLs starting with https://supabase.com * fix: replace all supabase urls with relative urls * chore: add linting for relative urls * chore: bump linter version * Prettier --------- Co-authored-by: Chris Chinchilla <chris.ward@supabase.io>
131 lines
3.7 KiB
Plaintext
131 lines
3.7 KiB
Plaintext
---
|
|
id: 'examples-postgres-on-the-edge'
|
|
title: 'Integrating with Supabase Database (Postgres)'
|
|
description: 'Connecting to Postgres from Edge Functions.'
|
|
subtitle: 'Connect to your Postgres database from Edge Functions.'
|
|
tocVideo: 'cl7EuF1-RsY'
|
|
---
|
|
|
|
Connect to your Postgres database from an Edge Function by using the `supabase-js` client.
|
|
You can also use other Postgres clients like [Deno Postgres](https://deno.land/x/postgres)
|
|
|
|
---
|
|
|
|
## Using supabase-js
|
|
|
|
The `supabase-js` client handles authorization with Row Level Security and automatically formats responses as JSON. This is the recommended approach for most applications:
|
|
|
|
```ts index.ts
|
|
import { createClient } from 'npm:@supabase/supabase-js@2'
|
|
|
|
Deno.serve(async (req) => {
|
|
try {
|
|
const supabase = createClient(
|
|
Deno.env.get('SUPABASE_URL') ?? '',
|
|
Deno.env.get('SUPABASE_PUBLISHABLE_KEY') ?? '',
|
|
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } }
|
|
)
|
|
|
|
const { data, error } = await supabase.from('countries').select('*')
|
|
|
|
if (error) {
|
|
throw error
|
|
}
|
|
|
|
return new Response(JSON.stringify({ data }), {
|
|
headers: { 'Content-Type': 'application/json' },
|
|
status: 200,
|
|
})
|
|
} catch (err) {
|
|
return new Response(String(err?.message ?? err), { status: 500 })
|
|
}
|
|
})
|
|
```
|
|
|
|
This enables:
|
|
|
|
- Automatic Row Level Security enforcement
|
|
- Built-in JSON serialization
|
|
- Consistent error handling
|
|
- TypeScript support for database schema
|
|
|
|
---
|
|
|
|
## Using a Postgres client
|
|
|
|
Because Edge Functions are a server-side technology, it's safe to connect directly to your database using any popular Postgres client. This means you can run raw SQL from your Edge Functions.
|
|
|
|
Here is how you can connect to the database using Deno Postgres driver and run raw SQL. Check out the [full example](https://github.com/supabase/supabase/tree/master/examples/edge-functions/supabase/functions/postgres-on-the-edge).
|
|
|
|
<$CodeSample
|
|
path="/edge-functions/supabase/functions/postgres-on-the-edge/index.ts"
|
|
title="Select from table with auth RLS"
|
|
language="typescript"
|
|
|
|
/>
|
|
|
|
---
|
|
|
|
## Using Drizzle
|
|
|
|
You can use Drizzle together with [Postgres.js](https://github.com/porsager/postgres). Both can be loaded directly from npm:
|
|
|
|
**Set up dependencies in `import_map.json`**:
|
|
|
|
```json supabase/functions/import_map.json
|
|
{
|
|
"imports": {
|
|
"drizzle-orm": "npm:drizzle-orm@0.29.1",
|
|
"drizzle-orm/": "npm:/drizzle-orm@0.29.1/",
|
|
"postgres": "npm:postgres@3.4.3"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Use in your function**:
|
|
|
|
```ts supabase/functions/drizzle/index.ts
|
|
import { drizzle } from 'drizzle-orm/postgres-js'
|
|
import postgres from 'postgres'
|
|
import { countries } from '../_shared/schema.ts'
|
|
|
|
const connectionString = Deno.env.get('SUPABASE_DB_URL')!
|
|
|
|
Deno.serve(async (_req) => {
|
|
// Disable prefetch as it is not supported for "Transaction" pool mode
|
|
const client = postgres(connectionString, { prepare: false })
|
|
const db = drizzle(client)
|
|
const allCountries = await db.select().from(countries)
|
|
|
|
return Response.json(allCountries)
|
|
})
|
|
```
|
|
|
|
You can find the full example on [GitHub](https://github.com/thorwebdev/edgy-drizzle).
|
|
|
|
---
|
|
|
|
## SSL connections
|
|
|
|
### Production
|
|
|
|
Deployed edge functions are pre-configured to use SSL for connections to the Supabase database. You don't need to add any extra configurations.
|
|
|
|
### Local development
|
|
|
|
If you want to use SSL connections during local development, follow these steps:
|
|
|
|
1. Download the SSL certificate from [Database Settings](/dashboard/project/_/database/settings)
|
|
2. Add to your [local .env file](/docs/guides/functions/secrets), add these two variables:
|
|
|
|
```bash
|
|
SSL_CERT_FILE=/path/to/cert.crt # set the path to the downloaded cert
|
|
DENO_TLS_CA_STORE=mozilla,system
|
|
```
|
|
|
|
Then, restart your local development server:
|
|
|
|
```bash
|
|
supabase functions serve your-function
|
|
```
|