
Sökte du "supabase vs drizzle" och förväntade dig ett vinnande alternativ? Här är vändningen: det finns inget, för Supabase är ett Postgres-backend (en Backend-as-a-Service) och Drizzle är ett TypeScript ORM som körs ovanpå en databasanslutning — inklusive en Supabase-anslutning. De lever på olika lager i din stack och konkurrerar alltså inte egentligen. Oroa dig inte, det är enklare än det låter.
TL;DR: Använd Supabase för backend (databas, auth, lagring, realtid). Lägg till Drizzle om du vill ha typsäker SQL för dina tyngre queries. De flesta produktionsappar slutar med att använda båda — tänk "hus och verktygslåda," inte "hus eller verktygslåda."
Supabase vs Drizzle i korthet
Här är den sida-vid-sida-bild som de flesta "vs"-sidor hoppar över. Lägg märke till hur lite dessa två överlappar — det är hela poängen.
| Dimension | Supabase | Drizzle |
|---|---|---|
| Vad det är | Postgres Backend-as-a-Service | TypeScript ORM / query builder |
| Lager | Backend-plattform | Dataaccessbibliotek |
| Databas | Hanterad Postgres | Ansluter till valfri Postgres (inkl. Supabase) |
| Auth / Lagring / Realtid | Ja (inbyggt) | Nej (utanför scope) |
| Typsäkra queries | Delvis (genererade typer) | Ja (förstklassig, infererad) |
| Migreringar | SQL-editor / CLI | drizzle-kit (schema-as-code) |
| Edge / serverless | Edge Functions (Deno) | ~7.4 kb, edge-native |
| Prissättning | Gratis / $25 / $599 | Gratis (öppen källkod) |
| Verkliga konkurrenter | vs Firebase, andra BaaS | vs Prisma, andra ORMs |
Ser du hur raderna knappt kolliderar? Supabase svarar på "var lever min app?"; Drizzle svarar på "hur frågar jag databasen i TypeScript?" Oavsett om du söker supabase vs drizzle eller drizzle vs supabase, styr den skillnaden varje beslut nedan.
Vad Supabase faktiskt är
Supabase är ett hanterat Postgres-backend som buntar ihop nästan allt en typisk app behöver från dag ett. BaaS — Backend-as-a-Service — innebär att du får ett riktigt backend (databas plus tjänster) utan att sätta upp egna servrar. Nyckelordet är riktigt: under huven är det äkta PostgreSQL, inte en proprietär abstraktion du inte kan ta dig ur senare.
Här är vad du får direkt ur lådan:
- Auth — e-post/lösenord, magic links, sociala inloggningar, SSO, lösenordsfritt.
- Lagring — S3-baserad fillagring med Row Level Security-policyer och bildtransformationer.
- Realtid — lyssna på databasändringar, presence och broadcast-kanaler.
- Edge Functions — TypeScript-funktioner på Deno, distribuerade globalt.
- Auto REST API via PostgREST (det förvandlar dina tabeller till ett omedelbart REST API) plus GraphQL via
pg_graphql. - Vektor-stöd för embeddings, så AI-funktioner har ett hem.
Standardsättet du pratar med allt detta från din app är supabase-js, det officiella klientbiblioteket. Det hanterar databasläsningar och -skrivningar (via PostgREST), auth-sessioner, realtidsprenumerationer och filuppladdningar — en klient för hela plattformen. Om du väger backends överhuvudtaget täcker vår fullständiga Supabase vs Firebase-jämförelse den sidan av beslutet i detalj.
Vad Drizzle faktiskt är
Drizzle är ett lättviktigt TypeScript ORM och query builder. Ett ORM (object-relational mapper) är ett bibliotek som låter dig skriva databasfrågor i ditt programmeringsspråk istället för råa SQL-strängar — men Drizzle håller sig förfriskande nära SQL, så du slåss aldrig mot en tung abstraktion.
Vad som utmärker det:
- Litet fotavtryck — ungefär 7.4 kb min+gzip med noll externa beroenden, vilket gör det edge-native.
drizzle-kit— CLI:n som hanterargenerate,migrateochpull(introspekterar en befintlig databas till TypeScript).- Drizzle Studio — en gratis visuell databasläsare för lokal utveckling.
- Typinferens — definiera ditt schema en gång i TypeScript och dina query-resultat är automatiskt fullständigt typade.
- Fler databaser — fungerar med Postgres, MySQL, SQLite med mera.
- Helt öppen källkod — det kostar $0.
Nu det viktiga: Drizzle är inte ett backend — ingen auth, ingen lagring, inget realtid, ingen API-server. Det gör exakt en sak: talar med en databas på ett typsäkert sätt. Att kalla det ett "ORM" svarar på den vanliga "supabase orm"-sökningen — Supabase levererar inget tungt ORM självt, så folk når för Drizzle (eller Prisma) när de vill ha ett.
supabase-js vs Drizzle: samma query, skriven på båda sätten
Skillnaden mellan supabase-js och Drizzle: supabase-js är hela plattformsklienten (databas via PostgREST, plus auth, realtid och lagring), medan Drizzle är ett typsäkert Postgres ORM som inte gör annat än att fråga databasen. För att göra det konkret: här är exakt samma query — "hämta publicerade inlägg med sin författare" — skriven först i supabase-js, sedan i Drizzle.
Först supabase-js (PostgREST)-versionen:
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
// Get published posts with their author
const { data, error } = await supabase
.from("posts")
.select("id, title, author:authors(name)")
.eq("published", true);
if (error) throw error;
// data: { id, title, author: { name } }[]Nu Drizzle-versionen av den identiska queryn:
import { drizzle } from "drizzle-orm/postgres-js";
import { eq } from "drizzle-orm";
import postgres from "postgres";
import { posts, authors } from "./schema";
const client = postgres(DATABASE_URL, { prepare: false });
const db = drizzle(client);
// Get published posts with their author
const data = await db
.select({
id: posts.id,
title: posts.title,
authorName: authors.name,
})
.from(posts)
.innerJoin(authors, eq(posts.authorId, authors.id))
.where(eq(posts.published, true));
// data is fully typed from your schema — no codegen stepSer du skillnaden i känsla? supabase-js använder PostgREST-kedjning — .from().select().eq() — och uttrycker joins via den inbäddade author:authors(name)-syntaxen, som ser elegant ut för enkla datashapes. Drizzle läses som SQL med TypeScript-superkrafter: explicita joins, explicita villkor, och resultattypen infereras direkt från ditt schema utan ett separat typgenereringssteg.
Ingen av dem är "bättre" i ett vakuum: supabase-js-queryn är kortare och levereras med plattformen, medan Drizzle-queryn ger kompileringstidssäkerhet på joinen och blir tydligare allteftersom queries växer — tre joins, villkorliga filter, aggregeringar. Det är den verkliga avvägningen.

Behöver du ens Drizzle med Supabase? (beslutsramverk)
Nej, du behöver vanligtvis inte Drizzle med Supabase — supabase-js tar de flesta appar till produktion på egen hand. Lägg till Drizzle bara när du vill ha kompileringstidstypssäkerhet på komplexa queries eller ett mindre edge-paket. Innan du lägger till ett beroende, gå igenom den här ärliga beslutsmatrisen.
Håll dig till supabase-js när:
- Du lutar dig mot realtidsprenumerationer, fil-/lagringsoperationer eller auth-flöden.
- Dina queries är mestadels enkel CRUD.
- Du vill ha en enda klient för hela appen.
- Du prototypar och vill ha maximal hastighet.
Lägg till Drizzle när:
- Du har komplexa joins eller aggregeringar som blivit besvärliga i PostgREST-syntax.
- Du vill ha kompileringstidstypssäkerhet på råa SQL-queries.
- Paketstorlek spelar roll för att du levererar till edge- eller serverless-runtimes.
- Du föredrar schema-as-code-migreringar som du kan granska i en pull request.
Använd båda (det vanligaste resultatet) när:
- Du vill ha
supabase-jsför auth, lagring och realtid, plus Drizzle för de tunga datafrågestigarna.
| Ditt behov | Nå för |
|---|---|
| Realtid, lagring, enkel CRUD, auth | supabase-js |
| Komplexa joins, typsäker SQL, edge-paketstorlek | Drizzle |
| En typisk produktions-SaaS | Båda |
Proffstips: Börja med
supabase-js. Nå för Drizzle när en query verkligen gör ont — inte innan. Att lägga till ett ORM i förtid är en verklig sak, och det lägger bara till setup du inte behöver än.
Om du skissar hela din stack snarare än en enskild query förklarar vår guide om att välja rätt SaaS-teknikstack hur backend- och ORM-beslutet passar in i den större bilden.

Hur du använder Supabase och Drizzle tillsammans (korrekt setup)
Ja, du kan använda Supabase och Drizzle tillsammans — och de flesta produktionsteam gör det. Behåll supabase-js för auth, lagring och realtid, peka sedan Drizzle på samma Supabase Postgres-anslutning för typsäkra datafrågor. Några korrekthetsdetaljer snubblar folk på, så låt oss nagla fast alla på ett ställe.
Installera och anslut (postgres-js-drivrutinen)
Installera de tre paket du behöver:
npm install drizzle-orm postgres
npm install -D drizzle-kitAnslut sedan med postgres-js-drivrutinen och ge klienten till Drizzle:
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
// prepare: false is REQUIRED with Supabase's transaction pooler
const client = postgres(process.env.DATABASE_URL!, { prepare: false });
export const db = drizzle(client);Den prepare: false-flaggan är inte valfri — läs vidare, för det är den enskilt vanligaste orsaken till att en Supabase + Drizzle-setup går sönder.
Pooler vs direkt anslutning: vilken sträng använder du?
Supabase ger dig två anslutningssträngar, och rätt beror på din runtime:
- Pooler (port 6543, transaktionsläge) — använd detta för serverless och edge-funktioner. Varje anrop är kortlivat, så du vill ha en poolad anslutning som delas ut per transaktion.
- Direkt anslutning (port 5432) — använd detta för långkörande servrar som håller en anslutning öppen.
Välj fel och du antingen tömmer anslutningar (direkt på serverless) eller lägger till onödig overhead. Poolern är också exakt vad som gör nästa fallgrop nödvändig.
Fallgropen med prepare: false
Du behöver prepare: false för att Supabases transaktionsläge-pooler inte stödjer förberedda satser, vilket Drizzles postgres-js-drivrutin använder som standard. Sätt ihop de två fakta och utan flaggan kastar dina queries fel i samma ögonblick de kör via poolern — vilket, på serverless, alltid är fallet.
I produktion är det här raden som biter folk: allt fungerar mot en direkt anslutning lokalt, sedan misslyckas varje query efter att du deployas till Vercel eller en Supabase Edge Function. Lösningen är en flagga:
const client = postgres(DATABASE_URL, { prepare: false });Fallgrop: Om dina Drizzle-queries fungerar lokalt men går sönder vid deployment, kolla den här flaggan först. Nio gånger av tio är det det.
Bevara RLS intakt
Row Level Security (RLS) är en av Supabases bästa funktioner, och du behöver inte ge upp den för att använda Drizzle — men du måste vara medveten. Det finns två typer av klienter:
- En adminklient som använder service-role-nyckeln kringgår RLS helt. Den är kraftfull och farlig — håll den strikt server-sida, aldrig nära webbläsaren.
- En RLS-respekterande klient lindar varje query i en transaktion som ställer in Postgres auth-konfigurationen (den aktuella användarens roll och claims) så att dina befintliga RLS-policyer gäller precis som de skulle via
supabase-js.
Här är formen på en RLS-respekterande query — ställ in auth-kontexten, kör sedan din Drizzle-query i samma transaktion:
import { sql } from "drizzle-orm";
async function rlsQuery(userJwtClaims: { sub: string; role: string }) {
return db.transaction(async (tx) => {
// Tell Postgres who's asking, so RLS policies kick in
await tx.execute(
sql`select set_config('request.jwt.claims', ${JSON.stringify(
userJwtClaims
)}, true)`
);
await tx.execute(sql`set local role authenticated`);
// This query now runs under the user's RLS policies
return tx.select().from(posts);
});
}Drizzle levererar också ett inbyggt RLS API och en drizzle-orm/supabase-import med Supabases fördefinierade roller (authenticated, anon), vilket gör schema-as-code-policyer renare. Rubriken: håll RLS på i Supabase och låt din RLS-respekterande Drizzle-klient respektera det.
Ska du stänga av Data API / PostgREST?
Bara om du frågar uteslutande via Drizzle. Supabase låter dig inaktivera Data API (PostgREST) i API-inställningar, vilket minskar din attackyta. Men om någon del av din app fortfarande använder supabase-js för data — och det gör den vanligtvis, för realtid eller snabba läsningar — lämna PostgREST på. Det finns ingen kostnad för att behålla det.
Om din app lever i Next.js (en mycket vanlig kombination här) täcker vår guide om att välja din Next.js framework-setup routning- och renderingssidan som omsluter detta datalager.
Att koppla upp Drizzle + Supabase korrekt med RLS och pooling snubblar många team på. Behöver du ett andra par ögon på ditt backend? Få en gratis konsultation →
Edge och serverless: där Drizzle verkligen lyser
Om du deployas till edge är det här Drizzle tjänar sitt plats. På ungefär 7.4 kb med inga interna binärer glider det in i begränsade runtimes där tyngre ORMs kämpar — Cloudflare Workers, Vercel Edge, AWS Lambda och till och med Supabase Edge Functions på Deno.
Varför spelar storleken så stor roll? Edge-funktioner straffas av kalla starter och paketgränser, så ett smalt, beroendefritt bibliotek innebär snabbare kalla starter och paket som faktiskt ryms. supabase-js fungerar vid edge också, men för ren dataåtkomst är Drizzles fotavtryck svårt att slå.
Några saker att tänka på vid edge:
- Använd transaktionsläge pooler-anslutningssträngen (med
prepare: false). - Håll din querylogik smal så att funktionen förblir liten och snabb.
Den runtime du deployas till påverkar detta också — vår jämförelse av var du ska deploya dina edge-funktioner jämför plattformarna så att du kan matcha ditt datalager med rätt värd.
Migrera från supabase-js till Drizzle utan en omskrivning
Har du redan skickat med supabase-js och vill nu ha Drizzle för några knepiga queries? Goda nyheter: du behöver ingen big-bang-omskrivning. Du kan köra båda i samma fil. Här är den inkrementella väg som team faktiskt använder.
- Behåll
supabase-jsexakt som det är — auth, lagring, realtid och den enkla CRUD det redan hanterar bra. Rör det inte. - Introspektera ditt befintliga schema till TypeScript så att Drizzle känner till dina tabeller (inklusive
auth-schemareferensen om du behöver den):
npx drizzle-kit pull- Lägg till Drizzle-klienten bredvid din befintliga Supabase-klient — samma databas, andra anslutning, med
prepare: falseinbakat. - Migrera en tung query i taget. Välj din smärtsammaste join eller aggregering, skriv om just den i Drizzle och skicka den.
- Lämna allt annat på
supabase-js. Det finns inget pris för att konvertera queries som redan var bra.
Oroa dig inte: Du kan anropa
supabase-jsoch Drizzle i samma funktion. Inget tvingar dig att välja globalt — migrera i den takt som är meningsfull.
Att skriva om queries för hand är den långsamma delen, och det är exakt den typ av mekanisk uppgift som de AI-kodningsagenter som snabbar upp detta hanterar väl — peka en på en PostgREST-query och låt den utkasta Drizzle-ekvivalenten för dig att granska.
Prissättning 2026: vad kostar allt egentligen?
Drizzle är gratis — det är helt öppen källkod, så det kostar $0. Supabase har en gratisnivå, sedan betalplaner på $25/månad (Pro) och $599/månad (Team) år 2026. Så den enda räkning du betalar för den här stacken är Supabase; att lägga till Drizzle kostar ingenting.
| Nivå | Supabase | Drizzle |
|---|---|---|
| Gratis | $0 (500 MB DB, 50k MAU; pausas efter 1 veckas inaktivitet, 2-projektsgräns) | $0 — helt öppen källkod |
| Pro | $25/mån + användning (8 GB DB, 100k MAU, $10 beräkningskredit) | — (gratis) |
| Team | $599/mån (SOC2/ISO, 14-dagars säkerhetskopiering, prioritetssupport) | — (gratis) |
| Enterprise | Anpassad (HIPAA, BYO cloud) | — (Studios inbäddningsbara B2B-version är den enda betalda delen) |
Drizzle är $0 och helt öppen källkod (Drizzle Studio ingår), så din enda datalagerräkning är Supabase — ORM:en åker med gratis.
En varning: Supabases gratistier pausar projekt efter en veckas inaktivitet och begränsar dig till två — utmärkt för prototyper, men du vill ha Pro för allt på riktigt. Om du är kostnadsmedveten och bygger smalt, håller vår sammanställning av verktyg som faktiskt är värda det för startups samma pragmatiska lins.
Vad sägs om Prisma?
Den naturliga följdfrågan: om du vill ha ett ORM, varför Drizzle och inte Prisma? Båda fungerar perfekt med Supabase, så det är en rättvis kamp — till skillnad från Supabase vs Drizzle.
- Drizzle — ~7.4 kb, edge-native, SQL-liknande syntax, yngre men växer snabbt (ungefär 900 000 veckovisa npm-nedladdningar). Utmärkt när paketstorlek och edge-runtimes spelar roll.
- Prisma — tyngre, men en berömt smidig utvecklarupplevelse och bredare adoption (ungefär 2,5 miljoner veckovisa nedladdningar). Utmärkt på traditionella långkörande servrar där paketet inte är en begränsning.
(Behandla dessa siffror som ungefärliga — de förändras ständigt.) Den ärliga sammanfattningen: välj Drizzle för edge/paketstorlek, välj Prisma för ergonomi på en vanlig server. Vilket som helst passar på en Supabase Postgres-anslutning utan dramatik.
Hur Techsy hanterar detta
På Techsy levererar vi produktionstestade appar på Supabase, Next.js och PostgreSQL varje dag, så det här är ingen åsikt baserad på dokumentläsning. Vårt standardupplägg: supabase-js** för plattformsfunktioner** (auth, lagring, realtid) och Drizzle på dataintensiva vägar där typsäkerhet och komplexa joins lönar sig — RLS aktiverat, prepare: false inbakat från rad ett.
Och ärligt talat? Många projekt vi levererar behöver aldrig Drizzle alls. Om en app är mestadels CRUD med realtid är supabase-js ensamt det renare svaret — och det är vad vi säger istället för att lägga till ett beroende för dess egen skull.
Vill du ha ett andra utlåtande om ditt Supabase-backend — schema, RLS och anslutningssetup inkluderat? Prata med vårt team →
Vanliga frågor
Är Drizzle en ersättning för Supabase?
Nej. De sitter på olika lager — Supabase är ditt backend (databas, auth, lagring, realtid), medan Drizzle är bara ett ORM som frågar en databas. Du ersätter inte det ena med det andra; om något frågar Drizzle den Postgres-databas som Supabase är värd för.
Behöver jag Drizzle om jag redan använder Supabase?
Nej — det är helt valfritt. supabase-js hanterar de flesta appar alldeles utmärkt. Lägg till Drizzle när du vill ha kompileringstidstypssäkerhet på komplexa queries eller när du levererar till edge-runtimes där paketstorlek spelar roll.
Kan jag använda Supabase och Drizzle tillsammans?
Ja, och det är den vanligaste varianten i praktiken. Behåll supabase-js för auth, lagring och realtid, peka sedan Drizzle på samma Supabase Postgres-anslutning för dina datafrågor. De samexisterar glatt i samma kodbas.
Vad är skillnaden mellan supabase-js och Drizzle?
supabase-js är en fullständig klient — databasåtkomst via PostgREST plus auth, realtid och lagring. Drizzle är ett direkt, typsäkert Postgres ORM utan auth eller realtid; det gör bara SQL i TypeScript. Den ena är hela plattformens klient, den andra är rent ett querylager.
Fungerar Drizzle med Supabases Row Level Security (RLS)?
Ja. Behåll RLS aktiverat och använd en RLS-respekterande klient som lindar queries i en transaktion som ställer in Postgres auth-kontexten. En service-role adminklient kringgår RLS, så använd den bara server-sida och exponera den aldrig för webbläsaren.
Varför behöver jag prepare: false med Supabase och Drizzle?
Supabases transaktionsläge connection pooler stödjer inte förberedda satser, vilket Drizzles postgres-js-drivrutin använder som standard. Att ange prepare: false undviker de resulterande felen. Hoppa över det och dina queries går sönder i poolade eller serverless-miljöer — ofta bara efter att du deployas.
Ska jag använda pooler- eller direkt anslutningssträng?
Använd poolern (transaktionsläge, port 6543) för serverless- och edge-funktioner, och den direkta anslutningen (port 5432) för långkörande servrar. Poolern är också det som gör prepare: false nödvändigt, så de två valen hänger ihop.
Är Drizzle gratis? Är Supabase gratis?
Drizzle är helt öppen källkod — $0, inklusive Drizzle Studio för lokal utveckling. Supabase har en gratisnivå, sedan Pro på $25/mån och Team på $599/mån (priser 2026). Kort sagt: din enda räkning är Supabase, och Drizzle lägger ingenting till den.
Drizzle vs Prisma för Supabase — vilket ORM ska jag välja?
Båda fungerar med Supabase, så du kan inte gå fel. Drizzle är lättare (~7.4 kb) och edge-native; Prisma har en mer mogen utvecklarupplevelse och bredare adoption. Välj Drizzle för edge och paketstorlek, Prisma för ergonomi på traditionella servrar.
Slutsatsen
Supabase vs Drizzle? Det var aldrig riktigt en tävling. Här är vad du tar med dig:
- De är inte konkurrenter. Supabase är ditt backend; Drizzle är ett valfritt typsäkert ORM som sitter ovanpå det.
- Att använda båda är det vanliga svaret —
supabase-jsför auth/lagring/realtid, Drizzle för de tunga datafrågestigarna. - Få korrekthetsdetaljerna rätt:
prepare: false, rätt anslutningssträng och en RLS-respekterande klient. Det är dessa som snubblar team i produktion. - Drizzle är gratis, så att lägga till det kostar ingenting — din enda räkning är Supabase.
- Börja enkelt. Nå för Drizzle när en query faktiskt gör ont, inte innan.

Sitter du fast i att välja mellan supabase-js, Drizzle eller båda för din stack? Få en gratis backend-konsultation →