---
title: Use Drizzle ORM with Bun
sidebarTitle: Drizzle with Bun
mode: center
---

Drizzle is an ORM that supports both a SQL-like "query builder" API and an ORM-like [Queries API](https://orm.drizzle.team/docs/rqb). It supports the `bun:sqlite` built-in module.

---

Create a fresh project with `bun init` and install Drizzle.

```sh terminal icon="terminal"
bun init -y
bun add drizzle-orm
bun add -D drizzle-kit
```

---

Then connect to a SQLite database with the `bun:sqlite` module and create the Drizzle database instance.

```ts db.ts icon="/icons/typescript.svg"
import { drizzle } from "drizzle-orm/bun-sqlite";
import { Database } from "bun:sqlite";

const sqlite = new Database("sqlite.db");
export const db = drizzle(sqlite);
```

---

To see the database in action, add these lines to `index.ts`.

```ts index.ts icon="/icons/typescript.svg"
import { db } from "./db";
import { sql } from "drizzle-orm";

const query = sql`select "hello world" as text`;
const result = db.get<{ text: string }>(query);
console.log(result);
```

---

Then run `index.ts` with Bun. Bun creates `sqlite.db` and executes the query.

```sh terminal icon="terminal"
bun run index.ts
```

```txt
{
  text: "hello world"
}
```

---

Now give the database a schema. Create a `schema.ts` file and define a `movies` table.

```ts schema.ts icon="/icons/typescript.svg"
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const movies = sqliteTable("movies", {
  id: integer("id").primaryKey(),
  title: text("name"),
  releaseYear: integer("release_year"),
});
```

---

Generate an initial SQL migration with the `drizzle-kit` CLI.

```sh terminal icon="terminal"
bunx drizzle-kit generate --dialect sqlite --schema ./schema.ts
```

---

The command creates a `drizzle` directory containing a `.sql` migration file and a `meta` directory.

```txt File Tree icon="folder-tree"
drizzle
├── 0000_ordinary_beyonder.sql
└── meta
    ├── 0000_snapshot.json
    └── _journal.json
```

---

Execute these migrations with a `migrate.ts` script. It connects to `sqlite.db`, then executes all unexecuted migrations in the `drizzle` directory.

```ts migrate.ts icon="/icons/typescript.svg"
import { migrate } from "drizzle-orm/bun-sqlite/migrator";

import { drizzle } from "drizzle-orm/bun-sqlite";
import { Database } from "bun:sqlite";

const sqlite = new Database("sqlite.db");
const db = drizzle(sqlite);
migrate(db, { migrationsFolder: "./drizzle" });
```

---

Run the script with `bun` to execute the migration.

```sh terminal icon="terminal"
bun run migrate.ts
```

---

Now add some data to the database. Create a `seed.ts` file with the following contents.

```ts seed.ts icon="/icons/typescript.svg"
import { db } from "./db";
import * as schema from "./schema";

await db.insert(schema.movies).values([
  {
    title: "The Matrix",
    releaseYear: 1999,
  },
  {
    title: "The Matrix Reloaded",
    releaseYear: 2003,
  },
  {
    title: "The Matrix Revolutions",
    releaseYear: 2003,
  },
]);

console.log(`Seeding complete.`);
```

---

Then run this file.

```sh terminal icon="terminal"
bun run seed.ts
```

```txt
Seeding complete.
```

---

The database now has a schema and some sample data. Query it with Drizzle by replacing the contents of `index.ts` with the following.

```ts index.ts icon="/icons/typescript.svg"
import * as schema from "./schema";
import { db } from "./db";

const result = await db.select().from(schema.movies);
console.log(result);
```

---

Then run the file. You should see the three movies you inserted.

```sh terminal icon="terminal"
bun run index.ts
```

```txt
[
  {
    id: 1,
    title: "The Matrix",
    releaseYear: 1999
  }, {
    id: 2,
    title: "The Matrix Reloaded",
    releaseYear: 2003
  }, {
    id: 3,
    title: "The Matrix Revolutions",
    releaseYear: 2003
  }
]
```

---

See the [Drizzle docs](https://orm.drizzle.team/docs/overview).
