Back to flin
flin

CRUD sans SQL

Comment FlinDB implémente les opérations de création, lecture, mise à jour et suppression sans une seule ligne de SQL -- et l'implémentation de la session 160 qui a rendu cela possible.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 3 min flin
EN/ FR/ ES
flinflindbcrudqueriesdeveloper-experience

Chaque application jamais construite a besoin de quatre opérations : créer, lire, mettre à jour, supprimer. Ces opérations sont si fondamentales que l'acronyme CRUD est devenu un raccourci industriel pour « gestion de données de base ». Et pourtant en 2026, effectuer ces quatre opérations nécessite encore d'apprendre SQL, de configurer un ORM, ou d'enchaîner des appels de méthodes sur un constructeur de requêtes.

FlinDB fait le CRUD différemment. Il n'y a pas de SQL. Il n'y a pas d'ORM. Il n'y a pas de couche de traduction. Vous sauvegardez une entité, et elle est sauvegardée. Vous cherchez une entité, et elle est trouvée.

Voici l'histoire de la session 160 : 37 tests, 380 lignes de Rust, et une expérience développeur qui fait ressembler les opérations de base de données à des affectations de variables.

Créer : Save et c'est parti

flinuser = User { name: "Thales", email: "[email protected]" }
save user

La méthode save gère à la fois la création et les mises à jour. Si l'entité n'a pas d'ID, c'est une nouvelle entité. Si elle en a déjà un, c'est une mise à jour.

Lire : Find, All, Where, First

flinuser = User.find(1)                          // Find by ID - O(1)
users = User.all                              // All entities
active_users = User.where(active == true)     // Where filter
admin = User.first(role == "admin")           // First match
total = User.count                            // Count

Chaînage de requêtes

flinresults = Product
    .where(category == "electronics")
    .where(price < 1000)
    .order(rating, desc)
    .limit(10)

Mettre à jour : modifier et sauvegarder

flinuser = User.find(1)
user.name = "New Name"
save user

Quand save est appelé sur une entité existante, l'état courant devient une version historique, la nouvelle devient la version courante, le numéro de version s'incrémente et le updated_at est mis à jour.

Supprimer : douce par défaut

flindelete User.find(1)

Toutes les requêtes dans ZeroCore filtrent automatiquement les entités supprimées en douceur. Pour la suppression permanente : destroy user.

L'écart d'expérience développeur

En FLIN :

flin// Create
user = User { name: "Thales", email: "[email protected]" }
save user

// Read
users = User.where(active == true).order(created_at, desc).limit(10)

// Update
user = User.find(1)
user.name = "New Name"
save user

// Delete
delete User.find(1)

La version FLIN se lit comme du pseudocode. Il n'y a pas de client à importer. Pas d'async/await à gérer. Pas d'objets de configuration imbriqués. Les opérations sont des verbes dans le langage, pas des méthodes sur une bibliothèque.

C'est le point. Le CRUD n'est pas la partie intéressante du développement d'applications. C'est la plomberie. FlinDB fait disparaître la plomberie pour que les développeurs puissent se concentrer sur les parties de leur application qui comptent vraiment.


Ceci est la partie 3 de la série « How We Built FlinDB ».

Navigation de la série : - [056] FlinDB: Zero-Configuration Embedded Database - [057] Entities, Not Tables - [058] CRUD Without SQL (vous êtes ici) - [059] Constraints and Validation in FlinDB - [060] Aggregations and Analytics

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

Le Step Zero ne suffisait pas : comment valider un constructeur sans valider le runtime a fait tomber toutes les sessions vocales de Déblo l’heure où nous avons livré le streaming caméra temps réel

La phase 14 a livré Déblo Eyes — streaming caméra temps réel via LiveKit vers Gemini Live native audio. Le premier deploy a fait tomber toutes les sessions vocales en production en quatre-vingt-dix secondes parce que notre Step 0 avait validé le constructeur sans exercer le runtime. Le build log de comment Déblo a eu des yeux, ce qu’un pré-vol incomplet a coûté, et quels points de polish ont été livrés ou reportés.

33 min May 20, 2026
debloclaude-opus-4.7claude-codegemini-live +25
Thales & Claude deblo

Le tiret cadratin qui a tué la production : comment un slogan marketing dans un header HTTP a fait tomber le chat de Déblo pendant 24 heures

Deux jours avant la soumission App Store, tout le produit chat de Déblo s’est cassé silencieusement. Pas de spinner, pas de toast, aucune erreur dans l’UI — juste un silence radio. L’incident de 24 heures se résumait à un seul « é » dans la valeur d’un header HTTP qui levait une UnicodeEncodeError avant qu’aucune requête vers OpenRouter ne quitte le backend. Post-mortem d’une fausse hypothèse, d’une trace Sentry, et d’un fix de six lignes qui a débloqué le lancement.

30 min May 19, 2026
debloclaude-opus-4.7claude-codeincident +19
Thales & Claude deblo

Six heures, d’une page blanche à la review Apple — Comment nous avons soumis Déblo à l’App Store, en direct

Marche à marche en direct de la soumission de Déblo à l’App Store iOS en six heures : ce que les validateurs d’Apple ont rejeté (un superscript Unicode), ce que nous avons corrigé (un Promotional Text gaspillé sur des marques tierces), et les rouages de l’ASO iOS que presque tout le monde rate.

30 min May 13, 2026
debloclaude-opus-4.7claude-codeapp-store +16