https://github.com/tursodatabase/turso-vercel
Turso + Vercel Integration
https://github.com/tursodatabase/turso-vercel
serverless sqlite turso vercel
Last synced: 4 months ago
JSON representation
Turso + Vercel Integration
- Host: GitHub
- URL: https://github.com/tursodatabase/turso-vercel
- Owner: tursodatabase
- License: mit
- Created: 2026-02-03T19:06:53.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-02-19T15:23:50.000Z (4 months ago)
- Last Synced: 2026-02-19T18:56:45.153Z (4 months ago)
- Topics: serverless, sqlite, turso, vercel
- Language: TypeScript
- Homepage:
- Size: 321 KB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Turso + Vercel Integration
Zero-config SQLite databases for Vercel Functions.
Turso ·
Docs ·
Blog & Tutorials
> **⚠️ Warning:** This software is in BETA. It may still contain bugs and unexpected behavior. Use caution with production data and ensure you have backups.
## Features
- **Zero-config databases** — Databases are created automatically on first use
- **Local SQLite** — Fast reads from a local database copy in the serverless function
- **Remote writes** — Writes go directly to the remote Turso server, so they're durable immediately
- **Partial replication** — Replicate just the data you need locally to serverless function
If you've used Cloudflare D1 before for SQLite access on serverless, this package provides similar semantics on Vercel Functions.
## Install
```bash
npm install @tursodatabase/vercel-experimental
```
## Setup
1. Get your Turso API token:
```bash
turso auth api-tokens mint my-vercel-token
```
2. Get your organization slug:
```bash
turso org list
```
3. Create a database group for your project (or use an existing one):
```bash
turso group create my-project
```
4. Add environment variables to your Vercel project:
```
TURSO_API_TOKEN=your-api-token
TURSO_ORG=your-org-slug
TURSO_GROUP=my-project
```
All databases are scoped to the configured group. You can have multiple databases per project, but they can only be created in and accessed from the specified group.
## Quickstart
```ts
import { createDb } from "@tursodatabase/vercel-experimental";
// Get or create a database in the configured group
const db = await createDb(process.env.TURSO_DATABASE!);
// Create tables
await db.execute(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
)
`);
// Insert data
await db.execute(
"INSERT INTO users (name, email) VALUES (?, ?)",
["Alice", "alice@example.com"]
);
// Query data
const result = await db.query("SELECT * FROM users");
console.log(result.rows);
```
## API Reference
### `createDb(name, options?)`
Creates or retrieves a database instance. The database is scoped to the group configured via `TURSO_GROUP`.
```ts
const db = await createDb(process.env.TURSO_DATABASE!);
```
> **Important:** Store database names passed to `createDb()` as secret environment variables in Vercel. If an attacker can control the database name, they could access any database in the group.
### `db.query(sql, params?)`
Execute a SELECT query and return results.
```ts
const result = await db.query(
"SELECT * FROM users WHERE id = ?",
[1]
);
console.log(result.columns); // ["id", "name", "email"]
console.log(result.rows); // [[1, "Alice", "alice@example.com"]]
```
### `db.execute(sql, params?)`
Execute an INSERT, UPDATE, DELETE, or DDL statement.
```ts
await db.execute(
"UPDATE users SET name = ? WHERE id = ?",
["Bob", 1]
);
```
### `db.push()`
Manually push local changes to the remote Turso database. Only needed when `remoteWrites` is disabled.
```ts
const db = await createDb(process.env.TURSO_DATABASE!, { remoteWrites: false });
await db.execute("INSERT INTO users (name) VALUES (?)", ["Charlie"]);
await db.push();
```
### `db.pull()`
Pull latest changes from the remote Turso database.
```ts
await db.pull(); // Get latest data from Turso
```
## Examples
### Next.js Server Component
```tsx
import { createDb } from "@tursodatabase/vercel-experimental";
async function getUsers() {
const db = await createDb(process.env.TURSO_DATABASE!);
const result = await db.query("SELECT * FROM users");
return result.rows;
}
export default async function UsersPage() {
const users = await getUsers();
return (
- {user[1]}
{users.map((user) => (
))}
);
}
```
### Next.js Server Action
```tsx
import { createDb } from "@tursodatabase/vercel-experimental";
import { revalidatePath } from "next/cache";
async function addUser(formData: FormData) {
"use server";
const name = formData.get("name") as string;
const db = await createDb(process.env.TURSO_DATABASE!);
await db.execute("INSERT INTO users (name) VALUES (?)", [name]);
revalidatePath("/users");
}
```
### API Route
```ts
import { createDb } from "@tursodatabase/vercel-experimental";
import { NextResponse } from "next/server";
export async function GET() {
const db = await createDb(process.env.TURSO_DATABASE!);
const result = await db.query("SELECT * FROM users");
return NextResponse.json(result.rows);
}
export async function POST(request: Request) {
const { name } = await request.json();
const db = await createDb(process.env.TURSO_DATABASE!);
await db.execute("INSERT INTO users (name) VALUES (?)", [name]);
return NextResponse.json({ success: true });
}
```
## Documentation
Visit our [official documentation](https://docs.turso.tech) for more details.
## Support
Join us [on Discord](https://tur.so/discord-ts) to get help using this SDK. Report security issues [via email](mailto:security@turso.tech).