Gel (ранее EdgeDB) — это графово-реляционная база данных, работающая на основе Postgres. Она предоставляет декларативный язык схем, систему миграций и объектно-ориентированный язык запросов, а также поддерживает необработанные SQL-запросы. Она решает проблему объектно-реляционного отображения на уровне базы данных, устраняя необходимость в библиотеке ORM в коде вашего приложения.
Сначала установите Gel, если вы ещё этого не сделали.
curl https://www.geldata.com/sh --proto "=https" -sSf1 | shirm https://www.geldata.com/ps1 | iexbrew install geldata/tap/gel-cliИспользуйте bun init для создания нового проекта.
mkdir my-gel-app
cd my-gel-app
bun init -yМы будем использовать CLI Gel для инициализации экземпляра Gel для нашего проекта. Это создаст файл gel.toml в корне нашего проекта.
gel project initNo `gel.toml` found in `/Users/colinmcd94/Documents/bun/fun/examples/my-gel-app` or above
Do you want to initialize a new project? [Y/n]
> Y
Specify the name of Gel instance to use with this project [default: my_gel_app]:
> my_gel_app
Checking Gel versions...
Specify the Version of Gel to use with this project [default: x.y]:
> x.y
┌─────────────────────┬──────────────────────────────────────────────────────────────────┐
│ Project directory │ /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app │
│ Project config │ /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/gel.toml│
│ Schema dir (empty) │ /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/dbschema│
│ Installation method │ portable package │
│ Version │ x.y+6d5921b │
│ Instance name │ my_gel_app │
└─────────────────────┴──────────────────────────────────────────────────────────────────┘
Version x.y+6d5921b is already downloaded
Initializing Gel instance...
Applying migrations...
Everything is up to date. Revision initial
Project initialized.
To connect to my_gel_app, run `gel`Чтобы проверить, работает ли база данных, давайте откроем REPL и выполним простой запрос.
gel
gel> select 1 + 1;2Затем выполните \quit для выхода из REPL.
gel> \quitПосле инициализации проекта мы можем определить схему. Команда gel project init уже создала файл dbschema/default.esdl для содержания нашей схемы.
dbschema
├── default.esdl
└── migrationsОткройте этот файл и вставьте следующее содержимое.
module default {
type Movie {
required title: str;
releaseYear: int64;
}
};Затем сгенерируйте и примените начальную миграцию.
gel migration createCreated /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/dbschema/migrations/00001.edgeql, id: m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrqgel migrateApplied m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrq (00001.edgeql)После применения нашей схемы давайте выполним некоторые запросы, используя клиентскую библиотеку Gel для JavaScript. Мы установим клиентскую библиотеку и CLI для генерации кода Gel, а также создадим файл seed.ts.
bun add gel
bun add -D @gel/generate
touch seed.tsВставьте следующий код в seed.ts.
Клиент автоматически подключается к базе данных. Мы вставляем несколько фильмов с помощью метода .execute(). Мы будем использовать выражение for из EdgeQL для превращения этой массовой вставки в один оптимизированный запрос.
import { createClient } from "gel";
const client = createClient();
const INSERT_MOVIE = `
with movies := <array<tuple<title: str, year: int64>>>$movies
for movie in array_unpack(movies) union (
insert Movie {
title := movie.title,
releaseYear := movie.year,
}
)
`;
const movies = [
{ title: "Матрица", year: 1999 },
{ title: "Матрица: Перезагрузка", year: 2003 },
{ title: "Матрица: Революция", year: 2003 },
];
await client.execute(INSERT_MOVIE, { movies });
console.log(`Заполнение данными завершено.`);
process.exit();Затем запустите этот файл с помощью Bun.
bun run seed.tsЗаполнение данными завершено.Gel реализует ряд инструментов генерации кода для TypeScript. Чтобы запросить нашу новую базу данных с данными типобезопасным способом, мы будем использовать @gel/generate для генерации конструктора запросов EdgeQL.
bunx @gel/generate edgeql-jsGenerating query builder...
Detected tsconfig.json, generating TypeScript files.
To override this, use the --target flag.
Run `npx @edgedb/generate --help` for full options.
Introspecting database schema...
Writing files to ./dbschema/edgeql-js
Generation complete! 🤘
Checking the generated query builder into version control
is not recommended. Would you like to update .gitignore to ignore
the query builder directory? The following line will be added:
dbschema/edgeql-js
[y/n] (leave blank for "y")
> yВ index.ts мы можем импортировать сгенерированный конструктор запросов из ./dbschema/edgeql-js и написать простой select-запрос.
import { createClient } from "gel";
import e from "./dbschema/edgeql-js";
const client = createClient();
const query = e.select(e.Movie, () => ({
title: true,
releaseYear: true,
}));
const results = await query.run(client);
console.log(results);
results; // { title: string, releaseYear: number | null }[]Запустив файл с помощью Bun, мы можем увидеть список фильмов, которые мы вставили.
bun run index.ts[
{
title: "Матрица",
releaseYear: 1999
}, {
title: "Матрица: Перезагрузка",
releaseYear: 2003
}, {
title: "Матрица: Революция",
releaseYear: 2003
}
]Полную документацию смотрите в документации Gel.