Introduction à EdgeDB

EdgeDB est une base de données Graph qui fait du développement local « le meilleur que j’ai jamais vu ». Découvrez pourquoi c’est le type de base de données dont nous avons le plus besoin.
Imaginez une base de données graphique évolutive, sécurisée et riche en fonctionnalités qui existe depuis près de 30 ans. EdgeDB n’est que cela. Postgres a été testé depuis 1996, et nous pouvons désormais l’interroger comme un Graph. Beau.
TL;DR
EdgeDB est remarquable. Vous pouvez facilement créer une base de données localement et la synchroniser avec le cloud à l’aide de branchements, de migrations et d’authentification prêtes à l’emploi. Tout est aussi sécurisé et évolutif que SQL : il s’agit simplement de Postgres.
Installation
Voici un bref résumé du Guide de démarrage rapide.
- Installez EdgeDB localement.
Fenêtres
iwr https://ps1.edgedb.com -useb | iex
Mac
curl https://sh.edgedb.com --proto '=https' -sSf1 | sh
Le programme d’installation téléchargera la dernière version et l’ajoutera à votre ordinateur. Vous pouvez avoir plusieurs instances installées et en cours d’exécution pour différents projets.
- Initialisez votre projet en tant que projet EdgeDB.
edgedb project init
Vous devez nommer votre instance de base de données, spécifier la version et créer un main
bifurquer.
C’est ça!
- Aussi, je vous suggère d’installer le Plugin VSCode pour EdgeDB afin que vous puissiez voir EdgeQL tel qu’il est censé être vu.
EdgeQL
Vous pouvez exécuter la ligne de commande Edge en exécutant edgedb
. Ici tu cours EdgeQL
commandes comme vous le feriez sql
commandes. Bien qu’EdgeQL soit généralement plus concis, il est également très avancé.
Taper \q
arrêter.
Interface utilisateur Edge
EdgeDB dispose également d’une interface utilisateur pour afficher votre base de données, tout comme Supabase, Drizzle ou phpMonAdmin. Vous pouvez ajouter des méthodes d’authentification ou même des plugins IA. Taper edgedb ui
.
Migration, succursales et surveillance
Votre schéma par défaut sera dans le dbschema/default.esdl
fichier dans votre projet.
module default {
}
Ce sera vide. Pensez à default
comme espace de noms global. EdgeDB prend également en charge types d’héritage et des objets abstraits complexes.
Migration
Modifiez votre schéma comme vous le souhaitez, puis tapez edgedb migration create
pour créer un nouveau fichier de migration. Si vous avez déjà utilisé Supabase, ce sera un processus similaire. Type suivant edgedb migrate
pour appliquer cette migration. Ton default.esdl
le fichier est maintenant à jour.
Exemple de démarrage rapide
module default {
type Person {
required name: str;
}
type Movie {
title: str;
multi actors: Person;
}
};
Ramification
EdgeDB vous permet de créer succursales avec edgedb branch create branch_name
. Vous pouvez changer avec edgedb branch switch branch_name
ou même rebase avec edgedb branch rebase main
. Le branchement vous permet d’ajouter des fonctionnalités et de les tester, ou simplement de les supprimer sans modifier la base de données principale.
Montre
Si vous souhaitez apporter des modifications à votre schéma en temps réel et qu’EdgeDB détecte et applique automatiquement la différence, vous pouvez exécuter edgedb watch
en arrière-plan lorsque vous modifiez votre schéma dans un autre terminal.
Tous les exemples
Regardons un exemple classique, le Toutes les applications.
module default {
type User {
required username: str {
constraint exclusive;
};
required created_at: datetime {
default := datetime_current();
};
updated_at: datetime;
multi todos := .<created_by[is Todo];
}
type Todo {
required complete: bool {
default := false;
};
required created_at: datetime {
default := datetime_current();
};
required text: str;
required created_by: User {
on target delete delete source;
};
}
};
- Ici, nous avons deux tables principales, ou nœuds :
User
etTodo
. - Nous n’avons pas besoin de créer un
id
car il est automatiquement créé avec unuuid
taper. - Nous définissons les valeurs par défaut dans une structure de type objet.
- Dans ce cas, nous pouvons établir un lien vers le
User
de laTodo
en définissant simplement le typeUser
sur le bon champ,created_by
. - Nous pouvons définir le lien inverse en utilisant une colonne calculée. Chaque utilisateur peut avoir plusieurs tâches. Nous l’avons défini comme
multi
et égal à.<created_by[is Todo];
ouTodo.created_by
. - Nous créons une colonne unique en utilisant
constraint exclusive
. - Nous utilisons la suppression en cascade en définissant
on target delete delete source
. Cela signifie que lorsqu’un utilisateur est supprimé, toutes ses tâches sont supprimées.
Utiliser ceci schémavous pouvez créer des index, des contraintes et même des déclencheurs de fonctions. Il est extrêmement puissant et facile à utiliser, et il vous rappelle à quel point le SQL complexe peut être pénible.
Ajouter un utilisateur
Nous pouvons ajouter un utilisateur un à la fois.
INSERT User {
username := 'bob'
};
INSERT User {
username := 'bill'
};
INSERT User {
username := 'tom'
};
Ou nous pouvons ajouter des utilisateurs en masse.
FOR username IN {'bob', 'bill', 'tom'} UNION (
INSERT User {
username := username
}
);
Ajouter un utilisateur avec une tâche
Vous pouvez ajouter un utilisateur avec une tâche à effectuer, mais vous ne pouvez pas le faire de manière imbriquée pour le moment. Heureusement, EdgeQL a un with
clause comme PostgreSQL (j’ai créé un demande de fonctionnalité pour l’insert imbriqué).
WITH inserted_user := (
INSERT User {
username := 'mark'
}
)
INSERT Todo {
complete := false,
text := 'Your todo text here',
created_by := inserted_user
};
Ajouter une tâche avec un utilisateur
Cependant, nous pouvons ajouter une tâche avec un utilisateur venant du sens inverse sans utiliser de with
clause. C’est parce que le type est User
pas un type calculé.
insert Todo {
text := 'nested insert',
created_by := (
insert User {
username := 'jon'
}
)
};
Ajouter plusieurs éléments de tâche avec un utilisateur
Nous pouvons ajouter plusieurs tâches à faire en utilisant un for
boucle après un with
clause.
with user := (
insert User {
username := 'pat'
}
)
for text in {'one', 'two'} union (
insert Todo {
text := text,
created_by := user
}
);
Ajouter une tâche avec un utilisateur existant
Nous devons simplement trouver l’utilisateur.
INSERT Todo {
text := 'New Todo',
complete := false,
created_by := (
SELECT User
FILTER .username="mark"
)
};
Sélectionner toutes les tâches
Nous pouvons facilement obtenir toutes les tâches à effectuer, tout comme GraphQL.
select Todo {
id,
complete,
created_by: {
id,
username
}
}
Sélectionnez les éléments à faire créés par X
Nous pouvons également facilement filtrer les résultats par une valeur imbriquée.
SELECT Todo {
id,
complete,
created_by: {
id,
username
}
}
FILTER .created_by.username="mark";
Obtenez le nombre de résultats
Vous pouvez compter ou agréger la somme des résultats comme en SQL.
SELECT count(
(SELECT Todo
FILTER .created_by.username="mark")
);
Obtenez des résultats avec comptage
Vous pouvez également obtenir les deux en même temps. Presque toutes les requêtes complexes sont possibles.
WITH
filtered_todos := (
SELECT Todo {
id,
complete,
created_by: {
id,
username
}
}
FILTER .created_by.username="mark"
)
SELECT {
todos := array_agg(filtered_todos),
count := count(filtered_todos)
};
Manuscrit
Enfin, vous ne pouvez pas mentionner EdgeDB sans évoquer ses capacités TypeScript.
npm install --save-prod edgedb
npm install --save-dev @edgedb/generate
EdgeDB a la capacité de créer des typesafe requêtes directement dans TypeScript.
import { e } from 'edgedb';
const result = await e.select(e.Todo, (todo) => ({
id: true,
complete: true,
created_by: {
id: true,
username: true,
},
filter: e.op(todo.created_by.username, '=', 'mark'),
})).run(client);
C’est en fait assez beau. Tu n’as pas besoin de quelque chose comme Bruine, Enquête ou prisme pour exécuter vos requêtes. EdgeDB dispose d’un générateur de requêtes de type sécurisé prêt à l’emploi !
Pensées finales
Je suis extrêmement enthousiasmé par EdgeDB. Je pense que les bases de données Graph devraient être la norme. Je pense que la principale raison pour laquelle nous avons des ORM est due à la complexité des jointures. PAS PLUS!
Enjeux et avenir
Postgres gère tous les problèmes de sécurité et de mise à l’échelle. Les problèmes que vous rencontrerez seront des demandes de fonctionnalités et des petits bugs ORM.
- Ils prévoient d’ajouter des observateurs de données en temps réel (comme les abonnements GraphQL) à l’avenir.
- J’ai fait une demande de fonctionnalité et j’espère que les insertions et les mises à jour imbriquées deviendront plus faciles. Je voudrais également gérer les insertions groupées comme un tableau. 🤞🏽
- La base de données gère déjà l’authentification, mais la documentation est faible et seuls quelques fournisseurs sont actuellement disponibles. Je soupçonne que cela va croître rapidement.
- Je ne pense pas que vous puissiez ajouter des extensions Postgres manuellement. Ils devraient être approuvés par l’équipe et ajoutés. Je ne suis pas sûr de l’avenir de cela.
Trésors
- Le développement local est le meilleur que j’ai vu. Sa facilité d’utilisation n’est comparable qu’à celle de Supabase ou Firebase, et elle est toujours meilleure que les deux.
- Ai-je mentionné qu’il n’y avait plus de jointures ?
- Utiliser un schéma est bien plus simple que d’utiliser des tables complexes ou de créer des instructions. Cela coule mieux.
- La base de données est relativement nouvelle et possède une gamme de fonctionnalités construites plus rapidement que n’importe quel concurrent que j’ai vu.
- EdgeDB est actif sur les réseaux sociaux, a une discorde et compte de nombreux utilisateurs et modérateurs pour vous aider.
C’est le type de base de données dont nous aurons besoin à l’avenir.
Source link