Salta ai contenuti

Turso & Astro

Turso è un database basato su libSQL, una fork di SQLite. È ottimizzato per query a bassa latenza, rendendolo adatto ad applicazioni globali.

  • La Turso CLI installata, con accesso eseguito
  • Un Database Turso con uno schema
  • L’URL del tuo Database
  • Un token di accesso

Ottieni l’URL del tuo database usando il comando seguente:

Terminal window
turso db show <database-name> --url

Crea un token di autorizzazione per il database:

Terminal window
turso db tokens create <database-name>

Aggiungi l’output dei due comandi nel tuo file .env nella cartella root del tuo progetto. Se il file non esiste, crealo.

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

Installa la libreria @libsql/client per connettere Turso ad Astro:

Terminal window
npm install @libsql/client

Crea un file turso.ts nella cartella src e richiama createClient, passando le variabili TURSO_DATABASE_URL e 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,
});

Per accedere delle informazioni sul tuo database, importa turso e esegui una query SQL dentro qualunque compoennte .astro.

L’esempio seguente ottiene tutti i posts dalla tua tabella, mostrando a schermo una lista di titoli in 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>

Il metodo execute() può prendere un oggetto per passare variaibli alla dichiariazione SQL, come uno slug, o un’impaginazione.

L’esempio seguente ottiene un valore singolo dalla tabella posts WHERE lo slug è un valore ottenuto da Astro.params, a questo punto mostra a schermo il titolo del post.

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>

Altre guide per servizi backend