Fermer

octobre 18, 2024

Introduction à EdgeDB

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.

  1. 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.

Bienvenue sur EdgeDB

  1. 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.

Branche - principale

C’est ça!

  1. 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é.

commandes edgedb

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_nameou 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 et Todo.
  • Nous n’avons pas besoin de créer un idcar il est automatiquement créé avec un uuid 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 la Todo en définissant simplement le type User 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 multiet égal à .<created_by[is Todo];ou Todo.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.

cartes utilisateur et tâches

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 Userpas 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