Gel (anteriormente EdgeDB) es una base de datos grafo-relacional impulsada por Postgres internamente. Proporciona un lenguaje de esquema declarativo, sistema de migraciones y lenguaje de consultas orientado a objetos, además de soportar consultas SQL sin procesar. Resuelve el problema de mapeo objeto-relacional en la capa de base de datos, eliminando la necesidad de una biblioteca ORM en tu código de aplicación.
Primero, instala Gel si aún no lo has hecho.
curl https://www.geldata.com/sh --proto "=https" -sSf1 | shirm https://www.geldata.com/ps1 | iexbrew install geldata/tap/gel-cliUsa bun init para crear un nuevo proyecto.
mkdir my-gel-app
cd my-gel-app
bun init -yUsaremos la CLI de Gel para inicializar una instancia de Gel para nuestro proyecto. Esto crea un archivo gel.toml en la raíz de nuestro proyecto.
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`Para ver si la base de datos está funcionando, abramos un REPL y ejecutemos una consulta simple.
gel
gel> select 1 + 1;2Luego ejecuta \quit para salir del REPL.
gel> \quitCon el proyecto inicializado, podemos definir un esquema. El comando gel project init ya creó un archivo dbschema/default.esdl para contener nuestro esquema.
dbschema
├── default.esdl
└── migrationsAbre ese archivo y pega el siguiente contenido.
module default {
type Movie {
required title: str;
releaseYear: int64;
}
};Luego genera y aplica una migración inicial.
gel migration createCreated /Users/colinmcd94/Documents/bun/fun/examples/my-gel-app/dbschema/migrations/00001.edgeql, id: m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrqgel migrateApplied m1uwekrn4ni4qs7ul7hfar4xemm5kkxlpswolcoyqj3xdhweomwjrq (00001.edgeql)Con nuestro esquema aplicado, ejecutemos algunas consultas usando la biblioteca cliente de JavaScript de Gel. Instalaremos la biblioteca cliente y la CLI de generación de código de Gel, y crearemos un archivo seed.ts.
bun add gel
bun add -D @gel/generate
touch seed.tsPega el siguiente código en seed.ts.
El cliente se conecta automáticamente a la base de datos. Insertamos un par de películas usando el método .execute(). Usaremos la expresión for de EdgeQL para convertir esta inserción masiva en una consulta optimizada única.
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: "The Matrix", year: 1999 },
{ title: "The Matrix Reloaded", year: 2003 },
{ title: "The Matrix Revolutions", year: 2003 },
];
await client.execute(INSERT_MOVIE, { movies });
console.log(`Sembrado completo.`);
process.exit();Luego ejecuta este archivo con Bun.
bun run seed.tsSembrado completo.Gel implementa varias herramientas de generación de código para TypeScript. Para consultar nuestra base de datos recién sembrada de manera segura en cuanto a tipos, usaremos @gel/generate para generar el constructor de consultas 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")
> yEn index.ts, podemos importar el constructor de consultas generado desde ./dbschema/edgeql-js y escribir una consulta select simple.
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 }[]Ejecutando el archivo con Bun, podemos ver la lista de películas que insertamos.
bun run index.ts[
{
title: "The Matrix",
releaseYear: 1999
}, {
title: "The Matrix Reloaded",
releaseYear: 2003
}, {
title: "The Matrix Revolutions",
releaseYear: 2003
}
]Para documentación completa, consulta la documentación de Gel.