Xata
Xata ↗ is a serverless data platform powered by PostgreSQL. Xata uniquely combines multiple types of stores (relational databases, search engines, analytics engines) into a single service, accessible through a consistent REST API.
To connect to Xata using Hyperdrive, follow these steps:
You can connect Hyperdrive to any existing Xata database with the default user and password provided by Xata.
To retrieve your connection string from the Xata dashboard:
- Go to the Xata dashboard ↗.
- Select the database you want to connect to.
- Select Settings.
- Copy the connection string from the
PostgreSQL endpointsection and add your API key.
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_nameMost 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.0yarn add pg@>8.13.0pnpm add pg@>8.13.0If using TypeScript, install the types package:
npm i -D @types/pgyarn add -D @types/pgpnpm add -D @types/pgAdd 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 ctx.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 Xata:
-
You need to have an existing Xata database to connect to or create a new database from your Xata workspace Create a Database ↗.
-
In your database, you have several options for creating a table: you can start from scratch, use a template filled with sample data, or import data from a CSV file. For this guide, choose Start with sample data. This option automatically populates your database with two sample tables:
PostsandUsers. -
Configure the Xata database credentials in your Worker:
You need to add your Xata database credentials as secrets to your Worker. First, get your database details from your Xata Dashboard ↗, then add them as secrets using Wrangler:
Terminal window # Add the Xata API key as a secretnpx wrangler secret put XATA_API_KEY# When prompted, paste your Xata API key# Add the Xata branch as a secretnpx wrangler secret put XATA_BRANCH# When prompted, paste your Xata branch name (usually 'main')# Add the Xata database URL as a secretnpx wrangler secret put XATA_DATABASE_URL# When prompted, paste your Xata database URL -
Install the Xata CLI ↗ and authenticate the CLI by running the following commands:
Terminal window npm install -g @xata.io/clixata auth login -
Once you have the CLI set up, In your Worker, run the following code in the root directory of your project:
Terminal window xata initAccept the default settings during the configuration process. After completion, a
.envand.xatarcfile will be generated in your project folder. -
To enable Cloudflare access the secret values generated when running in development mode, create a
.dev.varsfile in your project's root directory and add the following content, replacing placeholders with the specific values:XATA_API_KEY=<YOUR_API_KEY_HERE>XATA_BRANCH=<YOUR_BRANCH_HERE>XATA_DATABASE_URL=<YOUR_DATABASE_URL_HERE> -
The following example shows how to make a query to your Xata database in a Worker. The credentials needed to connect to Xata have been added as secrets to your Worker.
export default {async fetch(request, env, ctx): Promise<Response> {const xata = new XataClient({apiKey: env.XATA_API_KEY,branch: env.XATA_BRANCH,databaseURL: env.XATA_DATABASE_URL,});const records = await xata.db.Posts.select(["id","title","author.name","author.email","author.bio",]).getAll();return Response.json(records);},} satisfies ExportedHandler<Env>;
To learn more about Xata, refer to Xata'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