Saltearse al contenido

Turso y Astro

Turso es una base de datos distribuida construida sobre libSQL, una bifurcación de SQLite. Está optimizada para baja latencia de consultas, lo que la hace adecuada para aplicaciones globales.

  • La CLI de Turso instalada y iniciada sesión
  • Una base de datos Turso con un esquema
  • URL de tu base de datos
  • Un Token de Aceso

Obtén la URL de tu base de datos utilizando el siguiente comando:

Ventana de terminal
turso db show <nombre-de-la-base-de-datos> --url

Crea un token de autenticación para la base de datos:

Ventana de terminal
turso db tokens create <nombre-de-la-base-de-datos>

Agrega la salida de ambos comandos a tu archivo .env en la raíz de tu proyecto. Si este archivo no existe, crea uno.

.env
TURSO_DATABASE_URL=libsql://...
TURSO_AUTH_TOKEN=

Instala @libsql/client para conectar Turso a Astro:

Ventana de terminal
npm install @libsql/client

Crea un archivo turso.ts en la carpeta src e invoca createClient, pasándole TURSO_DATABASE_URL y TURSO_AUTH_TOKEN:

src/turso.ts
import { createClient } from "@libsql/client/web";
export const turso = createClient({
url: import.meta.env.TURSO_DATABASE_URL,
authToken: import.meta.env.TURSO_AUTH_TOKEN,
});

Para acceder a la información de tu base de datos, importa turso y ejecuta una consulta SQL dentro de cualquier componente .astro.

El siguiente ejemplo obtiene todos los posts de tu tabla y muestra una lista de títulos en un componente <BlogIndex />:

src/components/BlogIndex.astro
---
import {turso} from '../../turso'
const {rows} = await turso.execute('SELECT * FROM posts')
---
<ul>
{rows.map((post) => (
<li>{post.title}</li>
))}
</ul>

El método execute() puede tomar un objeto para pasar variables a la sentencia SQL, como slug o paginación.

El siguiente ejemplo obtiene una única entrada de la tabla posts WHERE el slug es el valor obtenido de Astro.params, luego muestra el título de la publicación.

src/pages/index.astro
---
import {turso} from '../../turso'
const {slug} = Astro.params
const {rows} = await turso.execute({
sql: 'SELECT * FROM posts WHERE slug = ?',
args: [slug!]
})
---
<h1>{rows[0].title}</h1>

Más guías de servicios backend