Supabase
Supabase ↗ is an open source Firebase alternative and a PostgreSQL database service that offers real-time functionality, database backups, and extensions. With Supabase, developers can quickly set up a PostgreSQL database and build applications.
When connecting to Supabase with Hyperdrive, you connect directly to the underlying Postgres database. This is recommended by Supabase ↗ when accessed server-side from Workers.
If you prefer to use the Supabase client, refer to the Supabase client
tab. To connect to Supabase using Hyperdrive, follow these steps:
You can connect Hyperdrive to any existing Supabase database as the Postgres user which is set up during project creation. Alternatively, to create a new user for Hyperdrive, run these commands in the SQL Editor ↗.
The database endpoint can be found in the database settings page ↗.
With a database user, password, database endpoint (hostname and port) and database name (default: postgres), you can now set up Hyperdrive.
To configure Hyperdrive, you will need:
- The IP address (or hostname) and port of your database.
- The database username (for example,
hyperdrive-demo
) you configured in a previous step. - The password associated with that username.
- The name of the database you want Hyperdrive to connect to. For example,
postgres
.
Hyperdrive accepts the combination of these parameters in the common connection string format used by database drivers:
postgres://USERNAME:PASSWORD@HOSTNAME_OR_IP_ADDRESS:PORT/database_name
Most database providers will provide a connection string you can directly copy-and-paste directly into Hyperdrive.
To create a Hyperdrive configuration with the Wrangler CLI, open your terminal and run the following command. Replace <NAME_OF_HYPERDRIVE_CONFIG> with a name for your Hyperdrive configuration and paste the connection string provided from your database host, or replace user
, password
, HOSTNAME_OR_IP_ADDRESS
, port
, and database_name
placeholders with those specific to your database:
npx wrangler hyperdrive create <NAME_OF_HYPERDRIVE_CONFIG> --connection-string="postgres://user:password@HOSTNAME_OR_IP_ADDRESS:PORT/database_name"
This command outputs a binding for the Wrangler configuration file:
{ "name": "hyperdrive-example", "main": "src/index.ts", "compatibility_date": "2024-08-21", "compatibility_flags": [ "nodejs_compat" ], "hyperdrive": [ { "binding": "HYPERDRIVE", "id": "<ID OF THE CREATED HYPERDRIVE CONFIGURATION>" } ]}
name = "hyperdrive-example"main = "src/index.ts"compatibility_date = "2024-08-21"compatibility_flags = ["nodejs_compat"]
# Pasted from the output of `wrangler hyperdrive create <NAME_OF_HYPERDRIVE_CONFIG> --connection-string=[...]` above.[[hyperdrive]]binding = "HYPERDRIVE"id = "<ID OF THE CREATED HYPERDRIVE CONFIGURATION>"
Install the node-postgres
driver:
npm i pg@>8.13.0
yarn add pg@>8.13.0
pnpm add pg@>8.13.0
If using TypeScript, install the types package:
npm i -D @types/pg
yarn add -D @types/pg
pnpm add -D @types/pg
Add the required Node.js compatibility flags and Hyperdrive binding to your wrangler.jsonc
file:
{ "compatibility_flags": [ "nodejs_compat" ], "compatibility_date": "2024-09-23", "hyperdrive": [ { "binding": "HYPERDRIVE", "id": "<your-hyperdrive-id-here>" } ]}
# required for database drivers to functioncompatibility_flags = ["nodejs_compat"]compatibility_date = "2024-09-23"
[[hyperdrive]]binding = "HYPERDRIVE"id = "<your-hyperdrive-id-here>"
Create a new Client
instance and pass the Hyperdrive connectionString
:
// filepath: src/index.tsimport { Client } from "pg";
export default { async fetch( request: Request, env: Env, ctx: ExecutionContext, ): Promise<Response> { // Create a new client instance for each request. const client = new Client({ connectionString: env.HYPERDRIVE.connectionString, });
try { // Connect to the database await client.connect(); console.log("Connected to PostgreSQL database");
// Perform a simple query const result = await client.query("SELECT * FROM pg_tables");
// Clean up the client after the response is returned, before the Worker is killed env.waitUntil(client.end());
return Response.json({ success: true, result: result.rows, }); } catch (error: any) { console.error("Database error:", error.message);
return Response.error(); } },};
- Learn more about How Hyperdrive Works.
- Refer to the troubleshooting guide to debug common issues.
- Understand more about other storage options available to Cloudflare Workers.
To set up an integration with Supabase:
-
You need to have an existing Supabase database to connect to. Create a Supabase database ↗ or have an existing database to connect to Supabase and load data from ↗.
-
Create a
countries
table with the following query. You can create a table in your Supabase dashboard in two ways:- Use the table editor, which allows you to set up Postgres similar to a spreadsheet.
- Alternatively, use the SQL editor ↗:
CREATE TABLE countries (id SERIAL PRIMARY KEY,name VARCHAR(255) NOT NULL); -
Insert some data in your newly created table. Run the following commands to add countries to your table:
INSERT INTO countries (name) VALUES ('United States');INSERT INTO countries (name) VALUES ('Canada');INSERT INTO countries (name) VALUES ('The Netherlands'); -
Configure the Supabase database credentials in your Worker:
You need to add your Supabase URL and anon key as secrets to your Worker. Get these from your Supabase Dashboard ↗ under Settings > API, then add them as secrets using Wrangler:
Terminal window # Add the Supabase URL as a secretnpx wrangler secret put SUPABASE_URL# When prompted, paste your Supabase project URL# Add the Supabase anon key as a secretnpx wrangler secret put SUPABASE_KEY# When prompted, paste your Supabase anon/public key -
In your Worker, install the
@supabase/supabase-js
driver to connect to your database and start manipulating data:Terminal window npm i @supabase/supabase-jsTerminal window yarn add @supabase/supabase-jsTerminal window pnpm add @supabase/supabase-js -
The following example shows how to make a query to your Supabase database in a Worker. The credentials needed to connect to Supabase have been added as secrets to your Worker.
import { createClient } from "@supabase/supabase-js";export default {async fetch(request, env) {const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY);const { data, error } = await supabase.from("countries").select("*");if (error) throw error;return new Response(JSON.stringify(data), {headers: {"Content-Type": "application/json",},});},};
To learn more about Supabase, refer to Supabase's official documentation ↗.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Products
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark
-