Documentation Index
Fetch the complete documentation index at: https://xata.io/docs/llms.txt
Use this file to discover all available pages before exploring further.
Drizzle ORM is a TypeScript-first ORM that provides type-safe database access with a SQL-like query builder. You can use Drizzle with Xata using either the standard PostgreSQL driver or the serverless driver for edge environments.
Prerequisites
- Xata account with a project and branch
- Node.js project with TypeScript
Installation
Install Drizzle ORM and the PostgreSQL driver:
npm install drizzle-orm postgres
npm install -D drizzle-kit
npm install drizzle-orm @neondatabase/serverless
npm install -D drizzle-kit
Get your connection string
Set it as an environment variable:
DATABASE_URL=postgresql://user:password@host:port/database
Connect to Xata
Standard (TCP)
Serverless (HTTP)
Serverless (WebSocket)
Use this for traditional servers and long-running applications:import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
const client = postgres(process.env.DATABASE_URL!);
export const db = drizzle(client);
Use this for serverless functions with single queries:import { drizzle } from 'drizzle-orm/neon-http';
import { neon } from '@neondatabase/serverless';
const client = neon(process.env.DATABASE_URL!);
export const db = drizzle(client);
Use this for serverless functions that need transactions:import { drizzle } from 'drizzle-orm/neon-serverless';
import { Pool } from '@neondatabase/serverless';
const pool = new Pool({ connectionString: process.env.DATABASE_URL! });
export const db = drizzle(pool);
Define your schema
Create a schema.ts file:
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
});
Query your database
import { db } from './db';
import { users } from './schema';
import { eq } from 'drizzle-orm';
// Insert a user
await db.insert(users).values({
name: 'Alice',
email: 'alice@example.com',
});
// Select all users
const allUsers = await db.select().from(users);
// Select with filter
const user = await db
.select()
.from(users)
.where(eq(users.email, 'alice@example.com'));
Create a drizzle.config.ts file for migrations:
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './schema.ts',
out: './drizzle',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
Run migrations
Generate and apply migrations:
# Generate migration files
npx drizzle-kit generate
# Apply migrations
npx drizzle-kit migrate
For serverless environments, consider using the Serverless Proxy to connect over HTTP or WebSocket instead of TCP.