====== std.db ======
Datenbank-Units für die direkte Kommunikation mit relationalen Datenbanken und Key-Value-Stores. Lyx implementiert alle Datenbankprotokolle **nativ über TCP** — ohne externe Treiber, Middleware-Schichten oder ORMs. Ausnahme: ''std.db.sqlite'' bindet libsqlite3 per FFI ein.
^ Unit ^ Protokoll / Port ^ Beschreibung ^
| [[lyx_-_programmiersprache:units:db:mysql|std.db.mysql]] | MySQL Prot. 41 / 3306 | MySQL/MariaDB-Client: Verbindung, Abfragen, Prepared Statements, Transaktionen |
| [[lyx_-_programmiersprache:units:db:postgres|std.db.postgres]] | Wire Protocol v3 / 5432 | PostgreSQL-Client ohne libpq: vollständige Frontend/Backend-Kommunikation, Binding, Connection Pool |
| [[lyx_-_programmiersprache:units:db:sqlite|std.db.sqlite]] | FFI libsqlite3 | SQLite3-Bindings: Verbindung, Prepared Statements, Binding (1-basiert), Column-Accessoren (0-basiert) |
| [[lyx_-_programmiersprache:units:db:redis|std.db.redis]] | RESP / 6379 | Redis-Vollclient: Strings, Lists, Hashes, Sets, Sorted Sets, Pub/Sub, Pipelining, TTL |
| [[lyx_-_programmiersprache:units:db:redis_simple|std.db.redis_simple]] | RESP / 6379 | Redis-Minimal-Client: nur GET/SET/DEL/EXPIRE — ohne std.string-Abhängigkeit |
----
===== Designprinzipien =====
* **Kein Treiber-Layer** — Lyx spricht das native Datenbankprotokoll direkt; kein libmysql, kein libpq, kein ODBC, kein Redis-Wrapper
* **Keine Abstraktionsschicht** — jede Unit ist auf ihr Protokoll spezialisiert und gibt dessen volle Funktionalität frei
* **Explizite Verbindungsverwaltung** — Verbindungen, Abfragen und Ressourcen werden manuell verwaltet
* **Fehler per Rückgabewert** — kein throw/catch; Fehler werden als ''int64 < 0'' oder ''0''-Pointer signalisiert
----
===== Verfügbare Units =====
==== std.db.mysql ====
MySQL-Client über MySQL-Protokoll 41 (TCP-Port 3306). Unterstützt Verbindungsaufbau mit Authentifizierung, einfache Abfragen, Ergebnis-Sets, Prepared Statements und Transaktionen.
import std.db.mysql;
var conn := MySQLConnect("127.0.0.1", 3306, "user", "pass", "mydb");
var res := MySQLQuery(conn, "SELECT id, name FROM users WHERE active = 1");
while (MySQLFetchRow(res) != 0) {
Print(MySQLGetRowStr(res, 0, 1));
}
MySQLFreeResult(res);
MySQLClose(conn);
→ [[lyx_-_programmiersprache:units:db:mysql|Vollständige Dokumentation: std.db.mysql]]
==== std.db.postgres ====
PostgreSQL-Client über das native Frontend/Backend Wire Protocol v3 (TCP-Port 5432) — ohne libpq. Unterstützt SimpleQuery, Prepared Statements, Parameter-Binding (0-basiert), Transaktionen mit Savepoints, Connection Pool, LISTEN/NOTIFY und COPY. MD5-Auth über ''std.crypto.md5''.
import std.db.postgres;
var conn := PGConnect("127.0.0.1", 5432, "mydb", "user", "pass");
if (PGIsConnected(conn) == 0) { return; }
var res := PGQuery(conn, "SELECT id, email FROM users LIMIT 10");
var i: int64 := 0;
while (i < PGNumRows(res)) {
PGFetchRow(res, i);
PrintLn(PGGetStr(res, 1)); // email
i := i + 1;
}
PGFreeResult(res);
PGClose(conn);
→ [[lyx_-_programmiersprache:units:db:postgres|Vollständige Dokumentation: std.db.postgres]]
==== std.db.sqlite ====
SQLite3-Bindings via FFI (''libsqlite3.so.0''). Prepared-Statement-Muster: ''SQLiteStmtPrepare'' → Bind → ''SQLiteStmtStep'' → Column-Accessoren → ''SQLiteStmtFinalize''. Parameter-Binding ist **1-basiert**, Column-Zugriff **0-basiert**.
import std.db.sqlite;
var db := SQLiteOpen("/data/app.db");
var stmt := SQLiteStmtPrepare(db, "SELECT name FROM users WHERE id = ?");
SQLiteBindInt(stmt, 1, 42);
if (SQLiteStmtStep(stmt) == SQLITE_ROW) {
Print(SQLiteColumnText(stmt, 0));
}
SQLiteStmtFinalize(stmt);
SQLiteClose(db);
→ [[lyx_-_programmiersprache:units:db:sqlite|Vollständige Dokumentation: std.db.sqlite]]
==== std.db.redis ====
Redis-Vollclient über das RESP-Protokoll (TCP-Port 6379). Unterstützt alle Redis-Datenstrukturen: Strings, Lists, Hashes, Sets, Sorted Sets, Streams sowie Pub/Sub, Pipelining und TTL-Verwaltung.
import std.db.redis;
var conn := RedisConnect("127.0.0.1", 6379);
RedisSet(conn, "session:42", "user_data_json");
RedisExpire(conn, "session:42", 3600);
var val := RedisGet(conn, "session:42");
Print(val);
RedisClose(conn);
→ [[lyx_-_programmiersprache:units:db:redis|Vollständige Dokumentation: std.db.redis]]
==== std.db.redis_simple ====
Minimaler Redis-Client ohne ''std.string''-Abhängigkeit. Stellt nur die vier grundlegenden Operationen bereit: ''GET'', ''SET'', ''DEL'', ''EXPIRE''. Geeignet für eingeschränkte Umgebungen oder als Laufzeit-Dependency-freie Alternative.
→ [[lyx_-_programmiersprache:units:db:redis_simple|Vollständige Dokumentation: std.db.redis_simple]]
----
===== Unit wählen =====
^ Szenario ^ Empfehlung ^
| Bestehende MySQL/MariaDB-Infrastruktur | ''std.db.mysql'' |
| PostgreSQL, Prepared Statements, Connection Pool | ''std.db.postgres'' |
| Embedded / Mobile / Single-File | ''std.db.sqlite'' |
| Caching, Sessions, Pub/Sub | ''std.db.redis'' |
| Minimale Binärgröße, nur GET/SET | ''std.db.redis_simple'' |
| Dokumente (JSON), flexible Schemata | ''[[lyx_-_programmiersprache:units:net:mongo|std.net.mongo]]'' |
----
===== Verwandte Units =====
* ''[[lyx_-_programmiersprache:units:net:mongo|std.net.mongo]]'' — MongoDB Wire Protocol (dokumentenbasiert, im Netzwerk-Namespace)
* ''[[lyx_-_programmiersprache:units:crypto:md5|std.crypto.md5]]'' — wird intern von ''std.db.postgres'' für MD5-Authentifizierung genutzt
* ''[[lyx_-_programmiersprache:units:hash|std.hash]]'' — Passwort-Hashing für eigene Benutzerverwaltung in Datenbanken
* ''[[lyx_-_programmiersprache:units:json|std.json]]'' — JSON-Serialisierung für Redis-Werte oder PostgreSQL-JSONB-Spalten
Letzte Aktualisierung: 2026-06-05