---
title: Connect from Drizzle to Neon
subtitle: Learn how to connect to Neon from Drizzle
enableTableOfContents: true
updatedOn: '2025-11-05T19:50:31.418Z'
---
How to connect from Drizzle using different drivers
How to configure Drizzle Kit for migrations
Drizzle with Neon Postgres (Drizzle Docs)Schema migration with Drizzle ORMNext.js Edge Functions with Drizzle
Drizzle is a modern ORM for TypeScript that provides a simple and type-safe way to interact with your database. This guide demonstrates how to connect your application to a Neon Postgres database using Drizzle ORM.
Working with AI coding assistants? Check out our [AI rules for Drizzle ORM with Neon](/docs/ai/ai-rules-neon-drizzle) to help your AI assistant generate better code when using Drizzle with your Neon database.
To connect a TypeScript/Node.js project to Neon using Drizzle ORM, follow these steps:
## Create a TypeScript/Node.js project
Create a new directory for your project and navigate into it:
```bash
mkdir my-drizzle-neon-project
cd my-drizzle-neon-project
```
Initialize a new Node.js project with a `package.json` file:
```bash
npm init -y
```
## Create a Neon project
If you do not have one already, create a Neon project.
1. Navigate to the [Projects](https://console.neon.tech/app/projects) page in the Neon Console.
2. Click **New Project**.
3. Specify your project settings and click **Create Project**.
## Get your connection string
Find your database connection string by clicking the **Connect** button on your **Project Dashboard** to open the **Connect to your database** modal. Select a branch, a user, and the database you want to connect to. A connection string is constructed for you.

The connection string includes the user name, password, hostname, and database name.
Create a `.env` file in your project's root directory and add the connection string to it. Your `.env` file should look like this:
```text shouldWrap
DATABASE_URL="postgresql://[user]:[password]@[neon_hostname]/[dbname]?sslmode=require&channel_binding=require"
```
## Install Drizzle and a driver
Install Drizzle ORM, Drizzle Kit for migrations, and your preferred database driver. Choose one of the following drivers based on your application's needs:
Use the Neon serverless HTTP driver for serverless environments (e.g., Vercel, Netlify).
```bash
npm install drizzle-orm @neondatabase/serverless dotenv
npm install -D drizzle-kit
```
Use the Neon WebSocket driver for long-running applications that require a persistent connection (e.g., a standard Node.js server).
```bash
npm install drizzle-orm @neondatabase/serverless ws dotenv
npm install -D drizzle-kit @types/ws
```
Use the classic `node-postgres` (`pg`) driver, a widely-used and stable choice for Node.js applications.
```bash
npm install drizzle-orm pg dotenv
npm install -D drizzle-kit @types/pg
```
Use the `postgres.js` driver, a modern and lightweight Postgres client for Node.js.
```bash
npm install drizzle-orm postgres dotenv
npm install -D drizzle-kit
```
## Configure Drizzle Kit
Drizzle Kit uses a configuration file to manage schema and migrations. Create a `drizzle.config.ts` file in your project root and add the following content. This configuration tells Drizzle where to find your schema and where to output migration files.
```typescript
import 'dotenv/config';
import { defineConfig } from 'drizzle-kit';
if (!process.env.DATABASE_URL) {
throw new Error('DATABASE_URL is not set in the .env file');
}
export default defineConfig({
schema: './src/schema.ts', // Your schema file path
out: './drizzle', // Your migrations folder
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL,
},
});
```
## Initialize the Drizzle client
Create a file: `src/db.ts`, to initialize and export your Drizzle client. The setup varies depending on the driver you installed.
```typescript
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/neon-http';
import { neon } from '@neondatabase/serverless';
const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle(sql);
```
```typescript
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/neon-serverless';
import { Pool, neonConfig } from '@neondatabase/serverless';
import ws from 'ws';
// For Node.js environments older than v22, you must provide a WebSocket constructor
neonConfig.webSocketConstructor = ws;
// To work in edge environments (Cloudflare Workers, Vercel Edge, etc.), enable querying over fetch
// neonConfig.poolQueryViaFetch = true
const pool = new Pool({ connectionString: process.env.DATABASE_URL! });
export const db = drizzle(pool);
```
```typescript
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
const pool = new Pool({
connectionString: process.env.DATABASE_URL!,
});
export const db = drizzle(pool);
```
```typescript
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
const client = postgres(process.env.DATABASE_URL!);
export const db = drizzle(client);
```
## Create a schema
Drizzle uses a schema-first approach, allowing you to define your database schema using TypeScript. This schema will be used to generate migrations and ensure type safety throughout your application.
The following example defines a schema for a simple `demo_users` table. Create a `src/schema.ts` file and add the following content:
```typescript
import { pgTable, serial, text } from 'drizzle-orm/pg-core';
export const demoUsers = pgTable('demo_users', {
id: serial('id').primaryKey(),
name: text('name'),
});
```
## Generate migrations
After defining your schema, you can generate migration files with Drizzle Kit. This will create the necessary SQL files to set up your database schema in Neon.
```bash
npx drizzle-kit generate
```
You should see output similar to the following, indicating that migration files have been created:
```bash
$ npx drizzle-kit generate
No config path provided, using default 'drizzle.config.ts'
Reading config file '/home/user/drizzle/drizzle.config.ts'
1 tables
demo_users 2 columns 0 indexes 0 fks
[✓] Your SQL migration file ➜ drizzle/0000_clever_purple_man.sql 🚀
```
You can find the generated SQL migration files in the `drizzle` directory specified in your `drizzle.config.ts`.
## Apply migrations
Apply the generated migrations (SQL files) to your Neon database using Drizzle Kit. This command will use the `drizzle.config.ts` file for database connection details and apply the migrations to your Neon database.
```bash
npx drizzle-kit migrate
```
You should see output similar to the following, indicating that the migrations have been applied successfully:
```bash
$ npx drizzle-kit migrate
No config path provided, using default 'drizzle.config.ts'
Reading config file '/home/user/drizzle/drizzle.config.ts'
Using 'pg' driver for database querying
```
You can verify that the `demo_users` table has been created in your Neon database by checking the **Tables** section in the Neon Console.
## Query the database
Create a file: `src/index.ts`, to interact with your database using the Drizzle client. Here's an example of inserting a new user and querying all users from the `demo_users` table:
```typescript shouldWrap
import { db } from './db';
import { demoUsers } from './schema';
async function main() {
try {
await db.insert(demoUsers).values({ name: 'John Doe' });
const result = await db.select().from(demoUsers);
console.log('Successfully queried the database:', result);
} catch (error) {
console.error('Error querying the database:', error);
}
}
main();
```
```typescript shouldWrap
import { db } from './db';
import { demoUsers } from './schema';
async function main() {
try {
await db.insert(demoUsers).values({ name: 'John Doe' });
const result = await db.select().from(demoUsers);
console.log('Successfully queried the database:', result);
} catch (error) {
console.error('Error querying the database:', error);
} finally {
// Close the database connection to ensure proper shutdown for Neon WebSocket, node-postgres, and postgres.js drivers
await db.$client.end();
}
}
main();
```
Run the script using `tsx`:
```bash
npx tsx src/index.ts
```
You should see output similar to the following, indicating that the user was inserted and queried successfully:
```bash
Successfully queried the database: [ { id: 1, name: 'John Doe' } ]
```
## Resources
- [Get Started with Drizzle and Neon](https://orm.drizzle.team/docs/get-started/neon-new)
- [Drizzle with Neon Postgres](https://orm.drizzle.team/docs/tutorials/drizzle-with-neon)
- [Schema migration with Neon Postgres and Drizzle ORM](/docs/guides/drizzle-migrations)
- [Todo App with Neon Postgres and Drizzle ORM](https://orm.drizzle.team/docs/tutorials/drizzle-nextjs-neon)