5.2 KiB
name, overview, todos
| name | overview | todos |
|---|---|---|
| MySQL-Integration mit Admin-Konfiguration | Erweitere das System um MySQL-Unterstützung mit einer Admin-Oberfläche zur Konfiguration. Die Datenbank wird in einer Konfigurationsdatei gespeichert und kann im Admin-Bereich geändert werden (erfordert Server-Neustart). |
MySQL/MariaDB-Integration mit Admin-Konfiguration
Übersicht
Erweitere das System um MySQL/MariaDB-Unterstützung neben SQLite3. Die Datenbank-Konfiguration wird in einer Konfigurationsdatei gespeichert und kann im Admin-Bereich verwaltet werden. Ein Wechsel erfordert einen Server-Neustart.
Hinweis: MariaDB ist vollständig MySQL-kompatibel und funktioniert mit derselben Schnittstelle (mysql2 Package).
Architektur
Datenbank-Abstraktionsschicht
Erstelle eine Abstraktionsschicht, die sowohl SQLite als auch MySQL unterstützt:
-
Neue Datei:
database/db-adapter.js- Abstrahiert
db.get(),db.run(),db.all()für beide Datenbanken - Promise-basierte API (für bessere Kompatibilität)
- Automatische Fehlerbehandlung
- SQL-Dialekt-Anpassung (z.B.
AUTOINCREMENTvsAUTO_INCREMENT)
- Abstrahiert
-
Neue Datei:
database/sqlite-adapter.js- SQLite-spezifische Implementierung
- Wrapper um sqlite3
-
Neue Datei:
database/mysql-adapter.js- MySQL/MariaDB-spezifische Implementierung
- Verwendet
mysql2Package (funktioniert mit MySQL und MariaDB)
-
Anpassung:
database.js- Lädt Konfiguration aus
config/database.json - Initialisiert entsprechenden Adapter
- Behält
initDatabase()Funktion bei
- Lädt Konfiguration aus
Konfigurationsdatei
Neue Datei: config/database.json
{
"type": "sqlite",
"sqlite": {
"path": "./stundenerfassung.db"
},
"mysql": {
"host": "localhost",
"port": 3306,
"user": "root",
"password": "",
"database": "stundenerfassung",
"charset": "utf8mb4"
}
}
Admin-Interface
Anpassung: routes/admin.js
- Neue Route
/admin/database/config(GET/PUT) - Zeigt aktuelle Datenbank-Konfiguration
- Formular zum Ändern der Datenbank-Einstellungen
- Warnung bei Wechsel (Server-Neustart erforderlich)
Anpassung: views/admin.ejs
- Neuer Abschnitt "Datenbank-Konfiguration"
- Formular für SQLite/MySQL/MariaDB-Auswahl
- Eingabefelder für MySQL/MariaDB-Verbindungsdaten
- Test-Verbindung Button
- Warnung bei Änderungen
- Hinweis: MariaDB funktioniert mit MySQL-Konfiguration
SQL-Anpassungen
Unterschiede zwischen SQLite und MySQL:
INTEGER PRIMARY KEY AUTOINCREMENT→INT AUTO_INCREMENT PRIMARY KEYTEXT→VARCHAR(255)oderTEXTREAL→DOUBLEoderDECIMALTEXT(unbegrenzt) →TEXToderLONGTEXTDATETIME DEFAULT CURRENT_TIMESTAMP→DATETIME DEFAULT CURRENT_TIMESTAMP(gleich)INSERT OR IGNORE→INSERT IGNORECOLLATE NOCASE→COLLATE utf8mb4_general_ci(für case-insensitive)- Foreign Keys müssen in MySQL explizit aktiviert werden
Anpassung: database.js - initDatabase()
- SQL-Generierung basierend auf Datenbanktyp
- Separate CREATE TABLE Statements für SQLite und MySQL
- Migrationen anpassen (ALTER TABLE Syntax)
Package-Abhängigkeiten
Anpassung: package.json
mysql2hinzufügen (bessere Promise-Unterstützung alsmysql, funktioniert mit MySQL und MariaDB)
Services und Routes
Alle Dateien, die db verwenden, müssen angepasst werden:
routes/*.js(7 Dateien)services/*.js(5 Dateien)checkin-server.js
Änderungen:
- Promise-basierte Queries verwenden (statt Callbacks)
- Oder: Callback-Wrapper in Adapter
Initialisierung
Anpassung: server.js
- Prüft ob
config/database.jsonexistiert - Erstellt Standard-Konfiguration falls nicht vorhanden
- Initialisiert Datenbank entsprechend Konfiguration
Implementierungsschritte
-
Datenbank-Abstraktionsschicht erstellen
database/db-adapter.js- Interfacedatabase/sqlite-adapter.js- SQLite-Implementierungdatabase/mysql-adapter.js- MySQL-Implementierung
-
Konfigurationssystem
config/database.jsonTemplate- Konfigurations-Loader in
database.js
-
SQL-Anpassungen
initDatabase()für beide Datenbanken anpassen- SQL-Dialekt-Unterschiede behandeln
-
Admin-Interface
- Route für Datenbank-Konfiguration
- View mit Konfigurationsformular
- Test-Verbindung Funktion
-
Alle Queries anpassen
- Callbacks zu Promises oder Callback-Wrapper
- SQLite-spezifische Syntax entfernen (z.B.
COLLATE NOCASE)
-
Dokumentation
- README.md aktualisieren
- Konfigurationsanleitung
Technische Details
- MySQL/MariaDB-Package:
mysql2(bessere Promise-Unterstützung, funktioniert mit beiden) - Kompatibilität: MariaDB ist vollständig MySQL-kompatibel, verwendet dieselbe Konfiguration
- Fallback: Bei Fehler in MySQL/MariaDB-Verbindung auf SQLite zurückfallen
- Validierung: Test-Verbindung vor Speichern der Konfiguration
- Sicherheit: MySQL/MariaDB-Passwörter verschlüsselt in Config speichern (optional)
Dateien die angepasst werden müssen
database.js→database/Ordner mit mehreren Dateienroutes/admin.js- Datenbank-Konfigurationviews/admin.ejs- Konfigurations-UIpackage.json- mysql2 Dependencyserver.js- Konfigurationspr