Einleitung: Warum braucht ein C++-Entwickler Datenbanken?
C++ ist eine der leistungsfähigsten Programmiersprachen, die für die Erstellung von Hochlastsystemen, Spielen, Finanzanwendungen und eingebetteter Software verwendet wird. Jede ernsthafte Anwendung benötigt jedoch Datenspeicherung. Hier kommen Datenbankverwaltungssysteme (DBMS) zur Rettung.
In diesem Artikel werden wir untersuchen, wie man mit zwei beliebten DBMS — dem relationalen PostgreSQL und dem dokumentenorientierten MongoDB — unter Verwendung von C++ eine Verbindung herstellt und grundlegende Operationen durchführt. Das Material richtet sich an Anfänger, die bereits mit den Grundlagen von C++ vertraut sind, aber noch nicht mit Datenbanken gearbeitet haben. Sie erfahren, wie Sie die erforderlichen Bibliotheken installieren, einfache CRUD-Abfragen schreiben und häufige Fehler vermeiden.
1. Einrichtung der Umgebung und Auswahl der Bibliothek
Bevor Sie Code schreiben, müssen Sie Client-Bibliotheken für die Arbeit mit Datenbanken installieren. Für C++ gibt es mehrere Optionen, aber wir werden uns die beliebtesten und stabilsten ansehen:
- Für PostgreSQL —
libpqxx(offizieller C++-Wrapper über libpq). - Für MongoDB —
mongocxx(offizieller C++-Treiber von MongoDB).
Installation von libpqxx (Ubuntu/Debian)
sudo apt-get updatesudo apt-get install libpqxx-devVerwenden Sie für Windows oder macOS die Paketmanager vcpkg oder Homebrew.
Installation von mongocxx
Installieren Sie zuerst den Basistreiber mongo-c-driver, dann den C++-Treiber:
# Ubuntusudo apt-get install libmongoc-dev libbson-devsudo apt-get install libmongocxx-devStellen Sie nach der Installation sicher, dass der Compiler die Header-Dateien finden kann. Vergessen Sie beim Kompilieren nicht, die Link-Flags anzugeben:
g++ -std=c++17 main.cpp -lpqxx -lpq -lmongocxx -lbson2. Arbeiten mit PostgreSQL in C++
PostgreSQL ist ein leistungsstarkes objektrelationales DBMS. Wir verwenden die Bibliothek libpqxx, die eine bequeme C++-Schnittstelle bietet.
Verbindung zum Server und Erstellen einer Tabelle
Schreiben wir zunächst ein einfaches Programm, das eine Verbindung zu einer lokalen Datenbank herstellt und eine Benutzertabelle erstellt:
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Verbindung zur Datenbank "testdb" als Benutzer "postgres" pqxx::connection conn("host=localhost dbname=testdb user=postgres password=secret"); if (conn.is_open()) { std::cout << "Verbindung zu PostgreSQL erfolgreich!" << std::endl; }
// Erstellen einer Transaktion pqxx::work txn(conn);
// SQL-Abfrage zum Erstellen einer Tabelle txn.exec("CREATE TABLE IF NOT EXISTS users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(100) UNIQUE NOT NULL);");
txn.commit(); // Änderungen übernehmen std::cout << "Tabelle users erstellt." << std::endl;
} catch (const std::exception &e) { std::cerr << "Fehler: " << e.what() << std::endl; } return 0;}CRUD-Operationen: Einfügen und Lesen von Daten
Fügen wir ein paar Datensätze hinzu und führen eine Abfrage durch:
pqxx::work txn(conn);
// Daten einfügentxn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "Ivan Petrov", "ivan@example.com");txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "Maria Smirnova", "maria@example.com");txn.commit();
// Daten lesenpqxx::nontransaction ntxn(conn);pqxx::result result = ntxn.exec("SELECT id, name, email FROM users;");
for (auto row : result) { std::cout << "ID: " << row[0].as<int>() << ", Name: " << row[1].as<std::string>() << ", E-Mail: " << row[2].as<std::string>() << std::endl;}