What is Xata?
Drizzle
beta
beta feature

Almost complete feature but still under development. There may be changes as we address issues and feedback. Use with caution.

Drizzle with Xata

Edit on GitHub

Drizzle is a TypeScript ORM that is focused on type safety and closely follows the SQL syntax.

#

Installation

Drizzle currently only works with Xata databases that are set up with the ability to make direct Postgres connections. Follow the instructions below to learn how to configure Drizzle to work with Xata in this method.

Enable Postgres connections in Xata

Beta

Xata now allows direct connections to Postgres. To enable it follow these steps:


1

Enable Postgres in your workspace settings

2

Create a brand new database with Postgres enabled

3

Use the @next version of our APIs within your project

npm install -g @xata.io/cli@next
npm install @xata.io/client@next

Check the Postgres documentation for details and troubleshooting.

You can use the following package managers:

npm install drizzle-orm @xata.io/client@next

If you want to use the TCP client, you need to install the pg package as well:

npm install pg

Drizzle works with Xata as a HTTP client or a TCP client. The HTTP client doesn't create a persistent connection to the Xata server, while the TCP client does and can be used for better performance with a higher number of requests.

To create a drizzle instance with the HTTP client, use the following code:

import { drizzle } from 'drizzle-orm/xata-http';
import { getXataClient } from './xata'; // Generated client

const xata = getXataClient();
const db = drizzle(xata);

To create a drizzle instance with the TCP client, use the following code:

import { drizzle } from 'drizzle-orm/node-postgres';
import { getXataClient } from './xata'; // Generated client
import { Client } from 'pg';

const xata = getXataClient();
const client = new Client({ connectionString: xata.sql.connectionString });
const db = drizzle(client);

For production use cases, you can create a pool of connections with the TCP client:

import { drizzle } from 'drizzle-orm/node-postgres';
import { getXataClient } from './xata'; // Generated client
import { Pool } from 'pg';

const xata = getXataClient();
const pool = new Pool({ connectionString: xata.sql.connectionString, max: 20 });
const db = drizzle(pool);

A full example of using Drizzle with Xata is shown below:

import { drizzle } from 'drizzle-orm/node-postgres';
import { pgTable, text } from 'drizzle-orm/pg-core';
import { eq } from 'drizzle-orm';
import { getXataClient } from './xata'; // Generated client

const xata = getXataClient();

const actors = pgTable('Actors', {
  id: text('id').primaryKey(),
  name: text('name'),
  city: text('city')
});

const db = drizzle(xata);

const result = await db
  .select({ name: actors.name, city: actors.city })
  .from(actors)
  .where(eq(actors.city, 'New York'))
  .execute();

The code imports required modules from the drizzle-orm libraries. It also brings in the eq function from drizzle-orm for value comparison and the getXataClient function from a local xata module. The getXataClient function is used to acquire an instance of the Xata client.

Currently, we recommend manually defining the schema like in the example above. Alternatively, you can try to use drizzle-kit experimental feature to generate the schema from the database.

  • Transactions are not supported in the HTTP client.
  • Drizzle Kit introspection has a bug with our xata_id default value. You need to manually wrap the value with backticks.
  • Xata File attachments columns are read-only and only shows file metadata. You will need to use the SDK to upload and download files.
  • Foreign key references are not yet available as they depend on support for anonymous code blocks.

On this page

InstallationInstall DrizzleUsageExampleLimitations