Hausakte verwendet Expo SQLite auf Android. Ihre Repository-Tests verwenden echte SQLite-Dateien über Node.js. Beide Wege teilen die Repository- und Migrationsregeln. Dieses Tutorial zeigt SQL direkt mit Node SQLite, damit Fremdschlüssel und Transaktionen ohne Gerät reproduzierbar werden. Der Anwendungscode bekommt später eine SqlConnection über einen Port.
01Eine echte SQLite-Verbindung öffnen
Node.js 22.13 oder neuer enthält node:sqlite. :memory: erzeugt eine echte, aber nur für diesen Lauf bestehende SQLite-Datenbank. Eine Dateiadresse würde die Daten dauerhaft speichern. Eine mögliche Experimental-Warnung ist kein Testfehler.
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec(`PRAGMA foreign_keys=ON;
CREATE TABLE houses(id TEXT PRIMARY KEY, name TEXT NOT NULL);
CREATE TABLE entries(id TEXT PRIMARY KEY, house_id TEXT NOT NULL REFERENCES houses(id), title TEXT NOT NULL, cost_cents INTEGER NOT NULL);`);
db.exec('BEGIN IMMEDIATE');
try {
db.prepare('INSERT INTO houses VALUES (?, ?)').run('h1', 'Home');
db.prepare('INSERT INTO entries VALUES (?, ?, ?, ?)').run('e1', 'h1', 'Roof', 12990);
db.exec('COMMIT');
} catch (error) {
db.exec('ROLLBACK');
throw error;
}
console.log(db.prepare('SELECT title, cost_cents FROM entries').all());
db.close();
Starten / prüfen
node database.mjs02SQL und Werte trennen
prepare erzeugt eine parametrisierte Anweisung. run bindet die Werte an ?. Sie werden nicht in einen SQL-String hineinkopiert. Das schützt auch Namen mit Anführungszeichen vor einer falschen Interpretation als SQL-Code.
03Eine Transaktion abschließen
BEGIN IMMEDIATE reserviert den Schreibzugriff. Eintrag und Akte werden gemeinsam geschrieben. catch rollt zurück. Diese Garantie gilt für SQL. Dateien im FileVault benötigen darüber hinaus koordinierte Entwürfe und Referenzregeln.
04Migrationen und Abfragen prüfen
Das echte Repository setzt Fremdschlüssel, WAL und busy_timeout. Es prüft user_version und ergänzt in Schema 2 Indizes. Tests müssen eine alte Datenbank mit vorhandenen Einträgen öffnen und danach deren Erhalt prüfen. Eine leere Neuinstallation genügt dafür nicht.
Die Ausgabe enthält Roof und cost_cents 12990. Die Transaktion wird abgeschlossen.
Deine Übung
Füge vor COMMIT einen Eintrag für house_id missing ein. Prüfe danach in catch die Anzahl der Häuser.
Lösung mit Erklärung anzeigen
Der Fremdschlüssel schlägt fehl. Nach ROLLBACK ist auch das zuvor eingefügte Haus weg. SELECT count(*) FROM houses ergibt 0. Genau diese gemeinsame Wirkung ist der Sinn der Transaktion.
Projektbezug und Quellen
Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.