@farming-labs/orm

Support Matrix

This page is the quick answer to:

If you want the full story for one stack, use Integrations. This page is just the short support view.

How to read this

Setup can mean different things depending on the backend:

Basic matrix

StackGenerationRuntimeSetupNotes
PrismaYesYesFullGenerated schema.prisma plus live PrismaClient runtime
DrizzleYesYesFullGenerated schema files plus live Drizzle runtime
KyselyNoYesFullRuntime-first relational integration
MikroORMNoYesFullRuntime-first relational integration
TypeORMNoYesFullRuntime-first relational integration
SequelizeNoYesFullRuntime-first relational integration
EdgeDB / GelNoYesNo-opRuntime bridge through the official Gel SQL client
Neo4jNoYesFullGraph runtime through the official Neo4j driver/session shapes
Cloudflare D1NoYesLimitedWorker-native SQLite binding with local/CI setup helpers
Cloudflare KVNoYesNo-opWorker-native key-value runtime
Redis / UpstashNoYesNo-opKey-value runtime for Redis and Upstash-compatible clients
Direct SQLYesYesFullSafe SQL generation plus direct SQL runtime
SupabaseVia SQLYesMixedWorks through raw PostgreSQL clients or the Supabase JS runtime
MongoDBNoYesFullNative Mongo runtime
MongooseNoYesFullMongoose-backed runtime
FirestoreNoYesLimitedReal runtime, but no SQL-style schema push
DynamoDBNoYesFullCreates one table per model through the runtime setup path
UnstorageNoYesNo-opLightweight key-value/document runtime

Important details

Relational stacks

Prisma, Drizzle, Kysely, MikroORM, TypeORM, Sequelize, and direct SQL are the strongest fit when the data model is relational or join-heavy.

They also carry the best support for:

Cloudflare D1

Cloudflare D1 is supported as its own runtime family rather than being folded into a generic SQL alias.

That means:

Two boundaries matter:

orm.transaction(...) is available, but the runtime does not claim full interactive rollback semantics the way a long-lived Node SQL connection can.

EdgeDB / Gel

EdgeDB support is a runtime bridge through the official Gel SQL client.

That means:

Setup is intentionally conservative here:

Neo4j

Neo4j is supported as a runtime-first graph backend through the official Neo4j driver and session shapes.

That means:

Two boundaries matter:

Cloudflare KV

Cloudflare KV is supported as its own runtime family rather than being folded into Redis or a generic document-store alias.

That means:

Setup is intentionally light here:

Redis / Upstash Redis

Redis and Upstash Redis fit as a shared key-value runtime family.

That means:

Setup is intentionally light here:

This runtime is a strong fit for sessions, verification tokens, cache metadata, rate limits, and other lightweight package-owned state. It is not the recommended fit for highly relational or join-heavy workloads.

Supabase

Supabase now works through two honest paths:

The PostgreSQL path keeps full SQL-style setup helpers. The direct Supabase JS runtime is query-first and keeps setup as a no-op.

Document and key-value runtimes

MongoDB, Mongoose, Firestore, DynamoDB, Cloudflare KV, Redis / Upstash Redis, and Unstorage still work through the same unified ORM API, but they are not SQL runtimes.

That means they rely more on:

Setup differences

Numeric IDs and namespaces

Unstorage boundary

Unstorage is useful for:

It is not the recommended runtime for highly relational or join-heavy database workloads.

Where to go next

Integrations · Framework Authors