npm.io
0.0.0 • Published 6d ago

drizzle-orm-expo-sqlite-async

Licence
MIT
Version
0.0.0
Deps
0
Size
32 kB
Vulns
0
Weekly
0

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-sqlite

drizzle-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

Keywords