Перейти к содержимому

Turso и Astro

Turso — это распределенная база данных, построенная на libSQL, форке SQLite. Она оптимизирована для низкой задержки запросов, что делает ее подходящей для глобальных приложений.

  • Установленный и авторизированный Turso CLI
  • База данных Turso со схемой
  • URL вашей базы данных
  • Токен доступа

Получите URL вашей базы данных с помощью следующей команды:

Окно терминала
turso db show <database-name> --url

Создайте токен аутентификации для базы данных:

Окно терминала
turso db tokens create <database-name>

Добавьте результаты выполнения обеих команд в файл .env в корне проекта. Если этот файл не существует, создайте его.

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

Установите @libsql/client для подключения Turso к Astro:

Окно терминала
npm install @libsql/client

Создайте файл turso.ts в папке src и вызовите createClient, передав ему TURSO_DATABASE_URL и 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,
});

Чтобы получить доступ к информации из вашей базы данных, импортируйте turso и выполните SQL-запрос внутри любого компонента .astro.

Следующий пример извлекает все posts из вашей таблицы, а затем выводит список заголовков в компоненте <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>

Метод execute() может принимать объект для передачи переменных в SQL-запрос, например, slug или пагинацию.

Следующий пример извлекает одну запись из таблицы posts, где slug - это значение, полученное из Astro.params, а затем отображает заголовок сообщения.

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>

Дополнительные руководства по бэкенд-сервисам