Post

Recréer un moteur de base de données en Python (pour comprendre comment ça marche vraiment)

Recréer un moteur de base de données en Python (pour comprendre comment ça marche vraiment)

Recréer un moteur de base de données en Python pour comprendre comment ça fonctionne

Les bases de données relationnelles sont utilisées partout, mais leur fonctionnement interne reste souvent opaque. Une requête SQL paraît simple en surface, pourtant elle déclenche une suite d’opérations complexes : analyse syntaxique, validation des types, exécution logique, accès disque, gestion des conditions, etc.

Plutôt que d’aborder ces mécanismes de manière théorique, j’ai choisi de les explorer en recréant un mini moteur de base de données relationnel en Python, sans dépendance externe pour le parsing SQL.


Objectif du projet

Ce projet n’a pas vocation à être utilisé en production. Son objectif principal est pédagogique : comprendre concrètement comment un SGBD fonctionne, depuis l’analyse d’une requête jusqu’au stockage des données sur disque.

Les axes principaux étaient :

  • implémenter un moteur SQL minimal mais fonctionnel
  • écrire un parseur SQL sans bibliothèque externe
  • concevoir un format binaire de stockage
  • gérer les opérations CRUD et les conditions WHERE
  • mettre en place une architecture client / serveur

Architecture générale

Le système repose sur un serveur central et plusieurs clients.

Serveur

  • moteur SQL
  • gestion des fichiers .db
  • authentification
  • communication réseau via sockets TCP

Clients

  • un client en ligne de commande
  • un client graphique
  • communication avec le serveur via TCP (port 1234)

Cette séparation permet de se rapprocher du fonctionnement réel des SGBD client/serveur.


Fonctionnalités SQL supportées

Le moteur prend en charge les commandes suivantes :

  • CREATE TABLE
  • DROP TABLE
  • INSERT
  • SELECT
  • UPDATE
  • DELETE
  • DESCRIBE

Types de données gérés :

  • INT
  • FLOAT
  • TEXT
  • BOOL
  • SERIAL (auto-incrément)

Les clauses WHERE supportent les opérateurs : =, <, >, <=, >=, !=, AND, OR, avec gestion des parenthèses.

Exemples

1
2
3
4
5
6
CREATE TABLE users (prenom TEXT, age INT, admin BOOL);

INSERT INTO users VALUES ("Julien", 25, True), ("Jean", 23, False);

SELECT prenom FROM users  
WHERE (age > 20 AND _id = 2) OR (age < 24 AND admin = False);

Un parseur SQL implémenté à la main

L’un des choix structurants du projet a été de ne pas utiliser de bibliothèque externe pour le parsing SQL.

Cette approche permet de comprendre :

  • la tokenisation d’une requête
  • la gestion de la priorité des opérateurs
  • la construction d’expressions logiques
  • la séparation entre syntaxe et exécution

Même si le langage supporté est volontairement limité, cette étape est centrale pour comprendre le fonctionnement interne d’un moteur SQL.


Stockage binaire des données

Les données sont stockées dans des fichiers .db, organisés en deux parties :

  • un header décrivant la structure de la table
  • les données, encodées en binaire

Le header

Le header contient :

  • le nom de la table
  • le nombre de colonnes
  • le nom et le type de chaque colonne
  • les informations liées aux colonnes SERIAL
  • la dernière valeur auto-incrémentée

Chaque fichier est autonome et contient sa propre description.

Les données

Chaque ligne est stockée sous la forme :

  • d’un booléen indiquant si la ligne est supprimée
  • des valeurs des colonnes, dans l’ordre défini par le header

La suppression est logique, ce qui simplifie l’implémentation et évite les réécritures coûteuses.


Communication réseau et authentification

Le serveur expose un service TCP sur le port 1234.
Une authentification est requise pour les clients, avec création d’un premier compte lors du lancement initial du serveur.

Cela permet d’introduire des notions réelles de sécurité, de protocole et de séparation des responsabilités.


Lancer le projet

1
2
3
4
5
6
7
8
9
git clone https://github.com/julien-lair/python---SGBD  
cd python\ -\ SGBD/

python3 -m venv .venv  
source .venv/bin/activate  
pip install -r requirements.txt  

python3 serveur/main.py  
python3 client_cli/main.py  

Enseignements tirés

Ce projet met en évidence plusieurs réalités souvent sous-estimées :

  • la complexité d’un SGBD dépasse largement l’écriture de requêtes SQL
  • le stockage et la gestion des erreurs sont des problématiques centrales
  • les choix de format de données ont des conséquences durables
  • les SGBD modernes sont le résultat de compromis techniques constants

Recréer un moteur, même minimal, permet de mieux comprendre les abstractions offertes par les bases de données existantes.


Conclusion

Ce projet constitue une base de réflexion et d’expérimentation autour du fonctionnement interne des SGBD.
Il n’a pas pour but d’être exhaustif, mais de rendre visibles des mécanismes souvent invisibles.

This post is licensed under CC BY 4.0 by the author.