Einleitung: Warum TypeScript und PostgreSQL das ideale Paar für Ihr Projekt sind
\n\nHaben Sie sich jemals gefragt, warum Entwickler immer häufiger die Kombination TypeScript und PostgreSQL wählen? Dies ist kein bloßer Modetrend – es ist ein leistungsstarkes Duo, das die Spielregeln in der modernen Webentwicklung verändert. Stellen Sie sich ein Schweizer Taschenmesser und einen zuverlässigen Tresor in einem vor: TypeScript bringt Strenge und Vorhersagbarkeit in den Code, PostgreSQL hingegen Zuverlässigkeit und Flexibilität bei der Datenspeicherung.
\n\nIn diesem Leitfaden werden wir nicht nur die Theorie durchgehen. Wir tauchen in die praktische Anwendung ein: Wir richten eine Verbindung ein, schreiben Abfragen, erstellen eine API und lernen, wie man typische Fehler vermeidet. Bereit? Los geht's!
\n\nUmgebungseinrichtung: Wie man mit TypeScript und PostgreSQL beginnt
\n\nBevor wir Code schreiben, bereiten wir den Boden vor. Das Installieren von Abhängigkeiten ist wie das Fundament eines Hauses: Je fester, desto länger hält das Projekt.
\n\nInstallation der erforderlichen Pakete
\n\nWir benötigen zwei Hauptwerkzeuge: pg (Client für PostgreSQL) und typescript mit Typen. Führen Sie im Terminal aus:
npm init -y\nnpm install pg\nnpm install -D typescript @types/node @types/pg\nnpx tsc --init\n\n\nBeachten Sie: Wir installieren die Typen für pg separat. Dies ist eine zwingende Voraussetzung für die Arbeit mit einer TypeScript-Datenbank – andernfalls wird der Compiler sich über fehlende Typen beschweren.
Grundlegende Projektstruktur
\n\nErstellen Sie die Datei database.ts – dies wird das Herzstück unserer Verbindung sein. Hier ist eine minimale, aber funktionierende Vorlage:
import { Pool } from 'pg';\n\nconst pool = new Pool({\n user: 'your_username',\n host: 'localhost',\n database: 'your_database',\n password: 'your_password',\n port: 5432,\n});\n\nexport default pool;\n\n\nWarum Pool und nicht ein normaler Client? Pool verwaltet einen Verbindungspool, was für die Produktion entscheidend ist. Stellen Sie sich vor, jede Anfrage sei ein Café-Besucher. Ohne Pool würden Sie für jeden Kunden ein neues Café eröffnen. Mit Pool haben Sie bereits einige Tische und setzen die Gäste einfach hin.
Grundlegende Operationen: CRUD mit TypeScript und PostgreSQL
\n\nJetzt kommt der spannende Teil – das Schreiben von Abfragen. Wir erstellen eine einfache Benutzertabelle und implementieren alle vier Operationen: Create, Read, Update, Delete.
\n\nTabelle erstellen
\n\nBevor wir mit Daten arbeiten, müssen wir eine Struktur erstellen. So geht es mit TypeScript:
\n\nimport pool from './database';\n\nasync function createTable() {\n const query = `\n CREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(255) UNIQUE NOT NULL,\n age INTEGER CHECK (age > 0),\n created_at TIMESTAMP DEFAULT NOW()\n );\n `;\n \n try {\n await pool.query(query);\n console.log('Tabelle users erstellt');\n } catch (error) {\n console.error('Fehler:', error);\n }\n}\n\ncreateTable();\n\n\nBeachten Sie SERIAL – dies ist ein Autoinkrement, das PostgreSQL selbst generiert. Und CHECK stellt sicher, dass das Alter positiv ist. Dies ist ein Beispiel dafür, wie PostgreSQL TypeScript gemeinsam die Datenintegrität auf zwei Ebenen gewährleisten.
Daten hinzufügen (Create)
\n\nDas Einfügen mit Parametern ist eine sichere Methode, um SQL-Injection zu vermeiden:
\n\ninterface User {\n name: string;\n email: string;\n age: number;\n}\n\nasync function addUser(user: User) {\n const query = `\n INSERT INTO users (name, email, age)\n VALUES ($1, $2, $3)\n RETURNING *;\n `;\n \n const values = [user.name, user.email, user.age];\n \n try {\n const result = await pool.query(query, values);\n console.log('Benutzer hinzugefügt:', result.rows[0]);\n return result.rows[0];\n } catch (error) {\n console.error('Fehler beim Hinzufügen:', error);\n throw error