Become a Gold Sponsor

Database connection with Drizzle

Drizzle ORM runs SQL queries on your database via database drivers.

index.ts
schema.ts
import { drizzle } from "drizzle-orm/connect"
import { users } from "./schema"

const db = await drizzle("node-postgres", process.env.DATABASE_URL);
const usersCount = await db.$count(users);
                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚   db.$count(users)   β”‚ <--- drizzle query
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     
                            β”‚               ʌ
select count(*) from users -β”‚               β”‚
                            β”‚               β”‚- [{ count: 0 }]
                            v               β”‚
                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                         β”‚    node-postgres    β”‚ <--- database driver
                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚               ʌ
01101000 01100101 01111001 -β”‚               β”‚
                            β”‚               β”‚- 01110011 01110101 01110000
                            v               β”‚
                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                         β”‚      Database      β”‚ 
                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Under the hood Drizzle will create a node-postgres driver instance which you can access via db.$client if necessary

import { drizzle } from "drizzle-orm/connect"

const db = await drizzle("node-postgres", process.env.DATABASE_URL);
const pool = db.$client;
// above is equivalent to
import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});
const db = drizzle(pool); // <--- sync 

The latter API is our original API which you can use when you need drizzle initialization to be synchronous.
Mostly every driver supports initialization via either connection URL or a set of connection params

import { drizzle } from "drizzle-orm/connect"

const db = await drizzle("node-postgres", "postgresql://users:[email protected]:5432/dbname");

// above is equivalent to
const db = await drizzle("node-postgres", {
  connection: {
    user: "user",
    password: "password",
    host: "127.0.0.1",
    port: 5432,
    database: "dbname",
  },
})

Drizzle is by design natively compatible with every edge or serverless runtime, whenever you’d need access to a serverless database - we’ve got you covered

import { drizzle } from "drizzle-orm/connect";

const db = await drizzle("neon-http", process.env.DATABASE_URL);
const db = await drizzle("neon-websocket", process.env.DATABASE_URL);
const db = await drizzle("vercel-postgres");
const db = await drizzle("planetscale", process.env.DATABASE_URL);
const db = await drizzle("d1", { connection: env.DB });

And yes, we do support runtime specific drivers like Bun SQLite or Expo SQLite:

import { drizzle } from "drizzle-orm/connect"

const db = await drizzle("bun:sqlite"); // <--- will create inmemory db
const db = await drizzle("bun:sqlite", "./sqlite.db");
import { drizzle } from "drizzle-orm/expo-sqlite";
import { openDatabaseSync } from "expo-sqlite/next";

const expo = openDatabaseSync("db.db");
const db = drizzle(expo);

Database connection URL

Just in case if you’re not familiar with database connection URL concept

postgresql://alex:[email protected]/dbname
             β””β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜
              ʌ    ʌ          ʌ                                              ʌ
        role -β”‚    β”‚          β”‚- hostname                                    β”‚- database
                   β”‚
                   β”‚- password

Next steps

Feel free to check out per-driver documentations