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.
useBrowseTable(id: string, tableName: string, params?: { limit?: number; offset?: number; }, options?: QueryOpts<BrowseTableResponse>)Types: BrowseTableResponse
const { data } = useBrowseTable("dbs_abc123", "users", {
limit: 50,
offset: 0,
});useCreateDatabase mutation
Create a new database.
useCreateDatabase(options?: MutationOpts<Database, CreateDatabaseParams>)Types: Database · CreateDatabaseParams
useDeleteDatabase mutation
Soft-delete a database. The underlying D1 instance stays live until purge.
useDeleteDatabase(options?: MutationOpts<SuccessResponse, string>)Types: SuccessResponse
useDescribeTable composite
Describe a single table (columns + row count).
useDescribeTable(id: string, tableName: string, options?: QueryOpts<DescribeTableResponse>)Types: DescribeTableResponse
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.
useExecuteSql(options?: MutationOpts<SqlResult, QueryDatabaseParams>)Types: SqlResult · QueryDatabaseParams
// ✅ 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 undefinedFor SELECT reads on mount, fire from useEffect and store rows in
state.
### `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.
useListTables(id: string, options?: QueryOpts<ListTablesResponse>)Types: ListTablesResponse
const { data } = useListTables("dbs_abc123");usePurgeDatabase composite
Permanently delete a soft-deleted database.
usePurgeDatabase(options?: MutationOpts<SuccessResponse, PurgeDatabaseParams>)Types: SuccessResponse · PurgeDatabaseParams
useRestoreDatabase composite
Restore a soft-deleted database.
useRestoreDatabase(options?: MutationOpts<Database, string>)Types: Database
useRetrieveDatabase query
Get a database by ID.
useRetrieveDatabase(id: string, options?: QueryOpts<Database>)Types: Database
useUpdateDatabase mutation
Update a database (rename / change description).
useUpdateDatabase(options?: MutationOpts<Database, UpdateDatabaseParams>)Types: Database · UpdateDatabaseParams