Databases hooks

React hooks for databases. Standard CRUD (`useListDatabases`, `useRetrieveDatabase`, `useCreateDatabase`, `useUpdateDatabase`, `useDeleteDatabase`, `useRestoreDatabase`) is generated; see ./databases.gen. Hooks for SQL execution and D1 introspection (list tables, describe table, browse rows) are hand-written below.

Hooks

useBrowseTable composite

Browse rows in a table with pagination.

TypeScript
useBrowseTable(id: string, tableName: string, params?: { limit?: number; offset?: number; }, options?: QueryOpts<BrowseTableResponse>)

Types: BrowseTableResponse

TypeScript
const { data } = useBrowseTable("dbs_abc123", "users", {
  limit: 50,
  offset: 0,
});

useCreateDatabase mutation

Create a new database.

TypeScript
useCreateDatabase(options?: MutationOpts<Database, CreateDatabaseParams>)

Types: Database · CreateDatabaseParams

useDeleteDatabase mutation

Soft-delete a database. The underlying D1 instance stays live until purge.

TypeScript
useDeleteDatabase(options?: MutationOpts<SuccessResponse, string>)

Types: SuccessResponse

useDescribeTable composite

Describe a single table (columns + row count).

TypeScript
useDescribeTable(id: string, tableName: string, options?: QueryOpts<DescribeTableResponse>)

Types: DescribeTableResponse

TypeScript
const { data } = useDescribeTable("dbs_abc123", "users");

useExecuteSql composite

Execute a SQL statement against a database. Returns rows, columns, and stats. Does not invalidate any query cache — queries are side-effect-free.

Mutation, not a query. TanStack Query's mutation shape — args pass to .mutate(...) / .mutateAsync(...), not to the hook itself. Calling it like a query silently no-ops: no network call, data stays undefined, no error. The "args were ignored" failure mode is the #1 deployed-element bug here because both forms typecheck.

TypeScript
useExecuteSql(options?: MutationOpts<SqlResult, QueryDatabaseParams>)

Types: SqlResult · QueryDatabaseParams

TypeScript
// ✅ Correct — args via mutate / mutateAsync
const { mutateAsync } = useExecuteSql();
const result = await mutateAsync({ id: "dbs_abc123", query: "SELECT ..." });
result.rows;

// ❌ Wrong — args to the hook are silently dropped, no network call
const { data } = useExecuteSql({ id: "dbs_abc123", query: "SELECT ..." });
data?.rows; // always undefined

For SELECT reads on mount, fire from useEffect and store rows in state.

text

### `useListDatabases` `query`

List databases with pagination.

```ts
useListDatabases(params?: Omit<ListDatabasesParams, | > & { filter?: DatabaseFilter; orderBy?: DatabaseOrderBy[]; } & DatabaseShorthands, options?: QueryOpts<Page<Database>>)

Types: ListDatabasesParams · DatabaseFilter · DatabaseOrderBy · DatabaseShorthands · Page · Database

useListTables query

List tables in a database.

TypeScript
useListTables(id: string, options?: QueryOpts<ListTablesResponse>)

Types: ListTablesResponse

TypeScript
const { data } = useListTables("dbs_abc123");

usePurgeDatabase composite

Permanently delete a soft-deleted database.

TypeScript
usePurgeDatabase(options?: MutationOpts<SuccessResponse, PurgeDatabaseParams>)

Types: SuccessResponse · PurgeDatabaseParams

useRestoreDatabase composite

Restore a soft-deleted database.

TypeScript
useRestoreDatabase(options?: MutationOpts<Database, string>)

Types: Database

useRetrieveDatabase query

Get a database by ID.

TypeScript
useRetrieveDatabase(id: string, options?: QueryOpts<Database>)

Types: Database

useUpdateDatabase mutation

Update a database (rename / change description).

TypeScript
useUpdateDatabase(options?: MutationOpts<Database, UpdateDatabaseParams>)

Types: Database · UpdateDatabaseParams