Skip to content

Drizzle ORM Data Provider

The @svadmin/drizzle package provides a DataProvider that connects directly to databases via Drizzle ORM, powered by refine-sqlx. No REST API needed — talk to your database directly.

Terminal window
bun add @svadmin/drizzle refine-sqlx drizzle-orm
DatabaseDrizzle DriverRuntime
SQLitedrizzle-orm/bun-sqliteBun
SQLitedrizzle-orm/better-sqlite3Node.js
PostgreSQLdrizzle-orm/postgres-jsBun / Node.js
MySQLdrizzle-orm/mysql2Node.js
Cloudflare D1drizzle-orm/d1Cloudflare Workers
import { createDrizzleDataProvider } from '@svadmin/drizzle';
import { drizzle } from 'drizzle-orm/bun-sqlite';
import { Database } from 'bun:sqlite';
import * as schema from './schema';
const db = drizzle(new Database('./app.db'), { schema });
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
});

Define your database schema using Drizzle ORM:

schema.ts
import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core';
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
name: text('name').notNull(),
email: text('email').notNull(),
role: text('role').default('user'),
});
export const posts = sqliteTable('posts', {
id: integer('id').primaryKey({ autoIncrement: true }),
title: text('title').notNull(),
content: text('content'),
authorId: integer('author_id').references(() => users.id),
});
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
softDelete: {
enabled: true,
field: 'deleted_at',
},
});
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
features: {
relations: { enabled: true },
},
});
// Then use in hooks:
const query = useOne({
resource: 'posts',
id: 1,
meta: { include: { author: true } },
});
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
features: {
transactions: { enabled: true },
},
});
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
features: {
aggregations: { enabled: true },
},
});
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
security: {
allowedTables: ['users', 'posts'],
hiddenFields: { users: ['password', 'apiKey'] },
maxLimit: 1000,
allowedOperations: ['read', 'create', 'update'],
},
});
import { createDrizzleDataProvider } from '@svadmin/drizzle';
import { drizzle } from 'drizzle-orm/d1';
import * as schema from './schema';
export default {
async fetch(request: Request, env: Env) {
const db = drizzle(env.DB, { schema });
const dataProvider = await createDrizzleDataProvider({
connection: db,
schema,
});
// ...
},
};
interface RefineSQLConfig<TSchema> {
/** Drizzle ORM instance */
connection: VariableDrizzleDatabase<TSchema>;
/** Drizzle schema definition */
schema: TSchema;
/** Field naming convention — default: 'snake_case' */
casing?: 'camelCase' | 'snake_case' | 'none';
/** Enable query logging */
logger?: boolean;
/** Soft delete configuration */
softDelete?: { enabled: boolean; field?: string };
/** Feature flags */
features?: {
relations?: { enabled: boolean };
aggregations?: { enabled: boolean };
transactions?: { enabled: boolean };
};
/** Security configuration */
security?: SecurityConfig;
}
Feature@svadmin/drizzle@svadmin/supabase@svadmin/simple-rest
ArchitectureDirect DB accessSupabase APIREST API
DependenciesDrizzle ORMSupabase SDKNone
Type safetySchema-levelRuntimeManual
Soft delete✅ Built-in❌ Manual❌ Manual
Relations✅ Drizzle relations✅ Foreign keys❌ No
Transactions✅ Built-in❌ No❌ No
Aggregations✅ Built-in❌ Manual❌ No
Security✅ Built-in guard✅ RLS❌ API-level
Offline / Edge✅ SQLite / D1❌ Cloud onlyDepends on API