Skip to content
Discord Get Started

SvelteKit

SvelteKit connects to DB9 through any standard PostgreSQL driver over pgwire. DB9 is PostgreSQL-compatible, so no special adapter is needed.

This guide shows how to wire up a SvelteKit app with DB9 using Prisma for schema-first workflows and Drizzle for TypeScript-first query building.

  • A DB9 database (create one)
  • Node.js 18+
  • SvelteKit 2+
Terminal
db9 create --name sveltekit-app

Get the connection string:

Terminal
db9 db status sveltekit-app

Set the connection string as an environment variable:

.env
DATABASE_URL="postgresql://sveltekit-app.admin:YOUR_PASSWORD@pg.db9.io:5433/postgres?sslmode=require"
Terminal
npx sv create sveltekit-db9
cd sveltekit-db9
npm install prisma @prisma/client
npx prisma init
prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Todo {
id Int @id @default(autoincrement())
title String
done Boolean @default(false)
createdAt DateTime @default(now())
}

Push the schema to DB9:

Terminal
npx prisma db push

Generate the client:

Terminal
npx prisma generate

Create a shared Prisma instance to avoid connection exhaustion during development:

src/lib/server/prisma.ts
import { PrismaClient } from '@prisma/client';
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
export const prisma = globalForPrisma.prisma ?? new PrismaClient();
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma;
}

SvelteKit load functions run on the server, making them the right place to query DB9.

src/routes/todos/+page.server.ts
import { prisma } from '$lib/server/prisma';
import type { PageServerLoad } from './$types';
export const load: PageServerLoad = async () => {
const todos = await prisma.todo.findMany({
orderBy: { createdAt: 'desc' },
});
return { todos };
};

SvelteKit form actions handle mutations server-side with progressive enhancement.

src/routes/todos/+page.server.ts
import { prisma } from '$lib/server/prisma';
import type { Actions, PageServerLoad } from './$types';
export const load: PageServerLoad = async () => {
const todos = await prisma.todo.findMany({
orderBy: { createdAt: 'desc' },
});
return { todos };
};
export const actions: Actions = {
create: async ({ request }) => {
const data = await request.formData();
await prisma.todo.create({
data: { title: data.get('title') as string },
});
},
toggle: async ({ request }) => {
const data = await request.formData();
const id = Number(data.get('id'));
const todo = await prisma.todo.findUniqueOrThrow({ where: { id } });
await prisma.todo.update({
where: { id },
data: { done: !todo.done },
});
},
};
  • Server-side only: All DB9 queries must run in load functions, form actions, or +server.ts API routes. Files in src/lib/server/ are automatically excluded from client bundles.
  • Port 5433: DB9 uses port 5433, not the default PostgreSQL port 5432.
  • TLS required: Use sslmode=require in the connection string for DB9’s hosted service.
  • Node adapter required: DB9 requires a TCP pgwire connection. Use @sveltejs/adapter-node for deployment — edge adapters (Cloudflare, Vercel Edge) do not support raw TCP sockets.

Install the Node adapter:

Terminal
npm install @sveltejs/adapter-node
svelte.config.js
import adapter from '@sveltejs/adapter-node';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
export default {
preprocess: vitePreprocess(),
kit: {
adapter: adapter(),
},
};

DB9 uses port 5433, not 5432. Verify your DATABASE_URL includes the correct port.

DB9 requires pgwire (TCP), which is not available in edge runtimes. Switch to @sveltejs/adapter-node. Cloudflare and Vercel Edge adapters will not work.

SvelteKit’s dev server reloads modules on change. Without the singleton pattern shown above, each reload opens a new connection pool. Use the globalThis pattern in src/lib/server/ and restart the dev server to release stale connections.

DB9 has limited information_schema support. If prisma db push fails, manage tables with raw SQL. See the Prisma guide for details.