Turso & libSQL - SQLite compatible con Edge

2024.12.30

Qué es Turso

Turso es un servicio de base de datos edge basado en libSQL (un fork de SQLite). Combina la ligereza de SQLite con replicación en ubicaciones edge para lograr acceso a datos con latencia ultra baja.

Qué es libSQL

libSQL es un proyecto de código abierto que es un fork de SQLite. Mientras mantiene compatibilidad con SQLite, agrega funciones como replicación, WebSocket y soporte HTTP.

Características

✓ Compatible con SQLite
✓ Replicación edge
✓ Embedded Replicas (SQLite dentro de la app)
✓ Baja latencia (proximidad edge)
✓ Optimizado para serverless
✓ Generoso tier gratuito

Configuración

Turso CLI

# Instalación
curl -sSfL https://get.tur.so/install.sh | bash

# Login
turso auth login

# Crear base de datos
turso db create my-app

# Conectar con shell
turso db shell my-app

JavaScript/TypeScript

import { createClient } from '@libsql/client';

const client = createClient({
  url: 'libsql://my-app-username.turso.io',
  authToken: process.env.TURSO_AUTH_TOKEN
});

// Ejecutar query
const result = await client.execute('SELECT * FROM users');

// Query con parámetros
const user = await client.execute({
  sql: 'SELECT * FROM users WHERE id = ?',
  args: [1]
});

// Transacción
const tx = await client.transaction('write');
await tx.execute('INSERT INTO users (name) VALUES (?)', ['Alice']);
await tx.execute('INSERT INTO users (name) VALUES (?)', ['Bob']);
await tx.commit();

Embedded Replicas

Mantiene una réplica SQLite dentro de la aplicación para lecturas ultra rápidas.

import { createClient } from '@libsql/client';

const client = createClient({
  url: 'file:local.db',  // Réplica local
  syncUrl: 'libsql://my-app-username.turso.io',  // Primario remoto
  authToken: process.env.TURSO_AUTH_TOKEN,
  syncInterval: 60  // Sincronizar cada 60 segundos
});

// Leer desde réplica local (ultra rápido)
const users = await client.execute('SELECT * FROM users');

// Ejecutar sincronización explícitamente
await client.sync();

Beneficios de Embedded Replicas

Latencia de lectura:
- DB remota: 50-100ms
- Embedded Replica: 1-5ms

Casos de uso:
- Cloudflare Workers
- Vercel Edge Functions
- Aplicaciones móviles
- Aplicaciones de escritorio

Integración con Drizzle ORM

// schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';

export const users = sqliteTable('users', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  name: text('name').notNull(),
  email: text('email').notNull().unique()
});

// db.ts
import { drizzle } from 'drizzle-orm/libsql';
import { createClient } from '@libsql/client';
import * as schema from './schema';

const client = createClient({
  url: process.env.TURSO_DATABASE_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN
});

export const db = drizzle(client, { schema });

// Uso
const allUsers = await db.select().from(users);

Ubicaciones Edge

Ubicaciones edge de Turso:
- Norteamérica: 10+
- Europa: 10+
- Asia: 5+
- Oceanía: 2+

-> Respuesta desde la ubicación más cercana al usuario

Configuración de grupos

# Crear grupo de ubicaciones
turso group create my-group --location nrt  # Tokio

# Agregar base de datos al grupo
turso db create my-db --group my-group

# Agregar réplicas
turso group locations add my-group sin  # Singapur
turso group locations add my-group lax  # Los Ángeles

Función de branches

# Crear branch
turso db create my-db --from-db production-db

# Desarrollar/probar en branch
turso db shell my-db
# Insertar datos de prueba...

# Merge a producción (manual)

Uso con Cloudflare Workers

// wrangler.toml
// [vars]
// TURSO_URL = "libsql://my-app-username.turso.io"

// src/index.ts
import { createClient } from '@libsql/client/web';

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const client = createClient({
      url: env.TURSO_URL,
      authToken: env.TURSO_AUTH_TOKEN
    });

    const result = await client.execute('SELECT * FROM users LIMIT 10');
    return Response.json(result.rows);
  }
};

Precios

Plan gratuito:
- 9GB almacenamiento
- 500 millones de lecturas/mes
- 5 millones de escrituras/mes
- 500 bases de datos

Plan Pro ($29/mes):
- 24GB almacenamiento
- Lecturas ilimitadas
- Bases de datos ilimitadas

Resumen

Turso es un servicio de base de datos que combina la ligereza de SQLite con las ventajas del edge computing. Las Embedded Replicas proporcionan lecturas con latencia ultra baja, siendo especialmente óptimo para aplicaciones en entornos edge.

← Volver a la lista