Die Clojure-Community freut sich über ein neues Release der Bibliothek Bisql (v0.4.0), die Entwicklern eine effizientere und konsistente Methode für den Umgang mit SQL-Datenbanken bietet. Die Bibliothek setzt auf eine SQL-first-Strategie und integriert nun Malli-Validierung, um die Zuverlässigkeit von Datenbankoperationen zu erhöhen.
Was ist Bisql und warum ist es besonders?
Bisql ist eine 2-Wege-SQL-Bibliothek für Clojure, die Entwicklern ermöglicht, Datenbankabfragen direkt als SQL-Templates zu schreiben – und das ohne Kompromisse bei der Lesbarkeit oder Konsistenz. Im Gegensatz zu anderen SQL-Templating-Bibliotheken, die oft auf Query-Builder setzen, verfolgt Bisql einen konsequenten SQL-first-Ansatz.
Viele SQL-Bibliotheken bieten zwar Query-Builder für einfache Abfragen an, doch diese Herangehensweise führt oft zu Inkonsistenzen im Code. Wenn ein Teil der Abfragen als SQL-Templates und ein anderer mit einem Builder geschrieben wird, geht die Transparenz verloren. Bisql vermeidet dieses Problem, indem jeder Datenbankzugriff als SQL-Template definiert wird.
Doch wie vermeidet die Bibliothek gleichzeitig den Aufwand von manuell geschriebenen CRUD-Operationen? Bisql generiert automatisch eine umfassende Sammlung typischer CRUD-Abfragen basierend auf dem Datenbankschema. Die Bibliothek analysiert Indizes und erstellt SQL-Templates für häufige Abfrage-Muster, die performant sind. Der defquery-Macro wandelt diese Templates dann in Clojure-Funktionen um – ohne dass Entwickler die Abfragen manuell schreiben müssen.
Malli-Validierung: Automatische Schema-Prüfung für Datenbankoperationen
Mit Version 0.4.0 führt Bisql eine tiefe Integration von Malli ein, einer beliebten Schema-Bibliothek für Clojure. Die neue Version ermöglicht es, in SQL-Templates Malli-Schemas für Eingabe- und Ausgabedaten zu definieren. Diese Schemas werden automatisch in die generierten Abfragefunktionen integriert.
Bei jedem Datenbankzugriff prüft Bisql nun, ob die bereitgestellten Parameter und die zurückgegebenen Daten dem definierten Schema entsprechen. Diese Validierung ist konfigurierbar und kann bei Bedarf deaktiviert werden. Zudem generiert Bisql automatisch eine `schema.clj`-Datei für jede Tabelle, die die grundlegenden Schemas für insert, update, row und andere Operationen enthält.
Beispiel: Eine generierte Abfrage mit Malli-Validierung
Ein typisches SQL-Template in Bisql sieht nun so aus:
/*:name crud.get-by-id */
/*:cardinality :one */
/*:malli/in [:map {:closed true} [:id int?]] */
/*:malli/out [:maybe sql.postgresql.public.users.schema/row] */
SELECT * FROM users WHERE id = /*$id*/1Der /*$id*/-Platzhalter wird durch den Parameter id ersetzt, und die Abfrage wird nur ausgeführt, wenn der Parameter dem Malli-Schema [:map {:closed true} [:id int?]] entspricht. Das Ergebnis wird ebenfalls gegen das Schema sql.postgresql.public.users.schema/row validiert.
Automatisch generierte Malli-Schemas
Für jede Tabelle erzeugt Bisql eine `schema.clj`-Datei mit den entsprechenden Malli-Schemas. Ein Beispiel für eine users-Tabelle könnte so aussehen:
(ns sql.postgresql.public.users.schema
(:refer-clojure :exclude [update])
(:require [bisql.schema :as bisql.schema]))
#_{:clojure-lsp/ignore [:clojure-lsp/unused-public-var]}
(def insert
[:map {:closed true}
[:id [:or int? bisql.schema/malli-default-sentinel]]
[:email string?]
[:display-name string?]
[:status [:or string? bisql.schema/malli-default-sentinel]]
[:created-at [:or [:fn bisql.schema/offset-date-time?] bisql.schema/malli-default-sentinel]]])
#_{:clojure-lsp/ignore [:clojure-lsp/unused-public-var]}
(def update (bisql.schema/malli-map-all-entries-optional insert))
#_{:clojure-lps/ignore [:clojure-lsp/unused-public-var]}
(def row (bisql.schema/malli-map-all-entries-strip-default-sentinel insert))Diese Schemas können dann in den SQL-Templates referenziert werden, um eine vollständige Typensicherheit für Datenbankoperationen zu gewährleisten.
Expressions-Sprache für bedingte SQL-Templates
Neben der Malli-Integration bringt Bisql 0.4.0 eine kleine Ausdruckssprache für `if`-Bedingungen innerhalb von SQL-Templates mit. Diese ermöglicht es, Abfragen dynamischer zu gestalten, ohne auf Query-Builder zurückzugreifen oder die SQL-Syntax zu verlassen.
Mit dieser Erweiterung können Entwickler bedingte Logik direkt in SQL-Templates einbauen, was die Flexibilität erhöht, ohne die Konsistenz des Ansatzes zu gefährden.
Fazit: Konsistenter, sicherer und effizienter Datenbankzugriff
Bisql 0.4.0 setzt neue Maßstäbe für die Entwicklung von Datenbankanwendungen in Clojure. Durch die Kombination von SQL-first-Entwicklung, automatischer Schema-Generierung und integrierter Validierung reduziert die Bibliothek den manuellen Aufwand erheblich, während gleichzeitig die Konsistenz und Zuverlässigkeit des Codes gesteigert wird.
Die Integration von Malli bringt dabei einen zusätzlichen Sicherheitsgewinn, da Datenbankoperationen nun automatisch auf ihre Korrektheit überprüft werden. Dies ist besonders für größere Projekte mit komplexen Datenmodellen von Vorteil.
Für Entwickler, die in Clojure mit SQL-Datenbanken arbeiten, lohnt es sich, Bisql 0.4.0 auszuprobieren – die Bibliothek könnte die Art und Weise, wie Datenbankzugriffe in Clojure-Projekten implementiert werden, nachhaltig verändern.
KI-Zusammenfassung
Bisql 0.4.0 now supports Malli schema validation for Clojure SQL templates, automating CRUD query generation while ensuring type safety. Discover how to streamline database access.