Astro DB
Astro DB — это полностью управляемая SQL-база данных, разработанная специально для экосистемы Astro. Разрабатывайте локально и развертывайте в любую базу данных, совместимую с libSQL.
Astro DB предоставляет комплексное решение для настройки, разработки и выполнения запросов к вашим данным. Локальная база данных создается в .astro/content.db автоматически при запуске astro dev, что позволяет работать без Docker или подключения к сети.
Установка
Заголовок раздела «Установка»Установите интеграцию @astrojs/db с помощью встроенной команды astro add:
npx astro add dbpnpm astro add dbyarn astro add dbОпределение базы данных
Заголовок раздела «Определение базы данных»При установке интеграции автоматически создается файл db/config.ts, где вы описываете таблицы вашей базы данных:
import { defineDb } from 'astro:db';
export default defineDb({ tables: { },})Таблицы
Заголовок раздела «Таблицы»Данные в Astro DB хранятся в SQL-таблицах. Таблицы структурируют данные в строки и столбцы, где столбцы определяют тип данных.
Определите таблицы в db/config.ts. Это позволит Astro сгенерировать TypeScript-интерфейсы для выполнения запросов с полной поддержкой автодополнения и проверки типов.
Пример таблицы Comment (Комментарий) с текстовыми полями:
import { defineDb, defineTable, column } from 'astro:db';
const Comment = defineTable({ columns: { author: column.text(), body: column.text(), }})
export default defineDb({ tables: { Comment },})Столбцы (Колонки)
Заголовок раздела «Столбцы (Колонки)»Astro DB поддерживает следующие типы данных:
const Comment = defineTable({ columns: { author: column.text(), // Строка текста likes: column.number(), // Число flagged: column.boolean(), // Булево значение (true/false) published: column.date(), // Дата (объект Date в JS) metadata: column.json(), // Объект JSON }});Связи между таблицами
Заголовок раздела «Связи между таблицами»Вы можете устанавливать связи между таблицами, используя ссылки. Обычно для этого используется id в качестве первичного ключа.
const Author = defineTable({ columns: { id: column.number({ primaryKey: true }), name: column.text(), }});
const Comment = defineTable({ columns: { authorId: column.number({ references: () => Author.columns.id }), body: column.text(), }});Наполнение данными (Seed)
Заголовок раздела «Наполнение данными (Seed)»Для тестирования и разработки вы можете наполнить базу начальными данными. Создайте файл db/seed.ts и используйте метод db.insert:
import { db, Comment, Author } from 'astro:db';
export default async function() { await db.insert(Author).values([ { id: 1, name: "Касим" }, { id: 2, name: "Мина" }, ]);
await db.insert(Comment).values([ { authorId: 1, body: 'Astro DB — это круто!' }, { authorId: 2, body: 'Согласна!'}, ])}База данных будет автоматически обновляться при каждом изменении этого файла.
Подключение к Turso
Заголовок раздела «Подключение к Turso»Astro DB полностью совместима с Turso — платформой для libSQL.
- Установите Turso CLI.
- Авторизуйтесь через
turso auth login. - Создайте базу данных:
turso db create my-db. - Получите URL:
turso db show my-db. Установите его в переменнуюASTRO_DB_REMOTE_URL. - Создайте токен:
turso db tokens create my-db. Установите его вASTRO_DB_APP_TOKEN. - Отправьте схему в облако:
astro db push --remote.
Выполнение запросов
Заголовок раздела «Выполнение запросов»Вы можете работать с БД на любой странице, в эндпойнте или действии Astro, используя ORM Drizzle.
Выборка (Select)
Заголовок раздела «Выборка (Select)»---import { db, Comment } from 'astro:db';
const comments = await db.select().from(Comment);---<h2>Комментарии</h2>{comments.map(({ author, body }) => ( <article> <p>Автор: {author}</p> <p>{body}</p> </article>))}Вставка (Insert)
Заголовок раздела «Вставка (Insert)»import { db, Comment } from 'astro:db';
await db.insert(Comment).values({ author: 'Астронавт', body: 'Поехали!'});Обновление схемы базы данных
Заголовок раздела «Обновление схемы базы данных»Если вы изменили структуру таблиц в коде, используйте команду astro db push --remote, чтобы применить эти изменения к вашей базе данных в облаке. Команда проверит совместимость изменений и предупредит о возможном риске потери данных.