drizzle-orm-expo-sqlite-async
An async Drizzle ORM driver for
expo-sqlite, built on
expo-sqlite's async API (runAsync / prepareAsync / getAllAsync /
getFirstAsync).
Why this exists
Drizzle's bundled drizzle-orm/expo-sqlite driver is hard-wired to
expo-sqlite's synchronous API (prepareSync / executeSync). That path is
unusable on web: the web build of expo-sqlite runs SQLite in a worker
(wa-sqlite), and the main-thread spin-wait the sync API needs can't be serviced,
so calls deadlock.
This package is a first-class BaseSQLiteDatabase<"async", …> backed by an
ExpoSQLiteAsyncSession that only ever calls the async expo-sqlite methods, so
the same Drizzle code works on iOS, Android, and web. It also batches
multi-row reads through prepareAsync(...).executeForRawResultAsync(...) .getAllAsync() — one bridge call per query instead of one per row.
It targets Drizzle v1's modern relations.
Install
npm i drizzle-orm-expo-sqlite-async drizzle-orm expo-sqlitedrizzle-orm is a peer dependency. react is an optional peer dependency,
needed only if you use the useMigrations hook from
drizzle-orm-expo-sqlite-async/migrator.
Usage
import * as SQLite from "expo-sqlite";
import { drizzle } from "drizzle-orm-expo-sqlite-async";
const sqlite = await SQLite.openDatabaseAsync("app.db");
const db = drizzle(sqlite, { schema });
await db.insert(users).values({ name: "ada" });
const rows = await db.select().from(users);On web, open the database with the async API (
openDatabaseAsync) so the worker-backed connection is used.
Migrations
import { migrate, useMigrations } from "drizzle-orm-expo-sqlite-async/migrator";
import migrations from "./drizzle/migrations";
// Imperative:
await migrate(db, migrations);
// Or as a React hook:
const { success, error } = useMigrations(db, migrations);License
MIT