Trabalho com Bancos de Dados em C++: PostgreSQL e MongoDB
Aplicações modernas em C++ raramente dispensam a interação com bancos de dados. Independentemente de você estar desenvolvendo um servidor de alta carga, um sistema de análise ou software embarcado, a habilidade de trabalhar com SGBDs relacionais (PostgreSQL) e orientados a documentos (MongoDB) é uma competência obrigatória. Neste artigo, abordaremos a conexão, execução de consultas e tratamento de erros para ambos os sistemas com exemplos práticos.
1. Preparação do Ambiente e Escolha das Bibliotecas
Para trabalhar com PostgreSQL em C++, o padrão de facto é a biblioteca libpqxx. Para MongoDB, o driver oficial é mongocxx (baseado em libmongoc).
Instalação do libpqxx (Linux / macOS)
# Ubuntu / Debiansudo apt-get install libpqxx-dev
# macOS (Homebrew)brew install libpqxxInstalação do mongocxx (Linux / macOS)
# É necessário instalar previamente libmongoc e boostsudo apt-get install libmongoc-1.0-0 libbson-1.0 libmongocxx-dev
# macOSbrew install mongo-cxx-driverPara Windows, use vcpkg ou baixe as compilações pré-compiladas dos repositórios oficiais.
2. Trabalho com PostgreSQL via libpqxx
A biblioteca libpqxx fornece uma interface C++ conveniente sobre o driver C libpq. As principais classes são: connection, work (transação), result.
Conexão ao Banco de Dados
#include <iostream>#include <pqxx/pqxx>
int main() { try { // String de conexão: "dbname=test user=postgres password=secret hostaddr=127.0.0.1 port=5432" pqxx::connection conn("dbname=testdb user=myuser password=mypass hostaddr=localhost"); if (conn.is_open()) { std::cout << "Connected to PostgreSQL: " << conn.dbname() << std::endl; } } catch (const std::exception &e) { std::cerr << "Connection error: " << e.what() << std::endl; return 1; } return 0;}Execução de Consultas (CRUD)
void createTable(pqxx::connection &conn) { pqxx::work txn(conn); txn.exec("CREATE TABLE IF NOT EXISTS users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(255) UNIQUE," "age INT" ")"); txn.commit();}
void insertUser(pqxx::connection &conn, const std::string &name, const std::string &email, int age) { pqxx::work txn(conn); // Usamos consulta parametrizada para proteção contra SQL injection txn.exec_params("INSERT INTO users (name, email, age) VALUES ($1, $2, $3)", name, email, age); txn.commit(); std::cout << "User inserted." << std::endl;}
void selectUsers(pqxx::connection &conn) { pqxx::nontransaction txn(conn); pqxx::result result = txn.exec("SELECT id, name, email, age FROM users"); for (auto row : result) { std::cout << "ID: " << row["id"].as<int>() << ", Name: " << row["name"].as<std::string>() << ", Email: " << row["email"].as<std::string>() << ", Age: " << row["age"].as<int>() << std::endl; }}Tratamento de Erros
Todas as operações devem ser envolvidas em try-catch. O libpqxx gera exceções das classes pqxx::sql_error, pqxx::broken_connection e outras.
3. Trabalho com MongoDB via mongocxx
O driver mongocxx utiliza C++17 moderno. As principais entidades são: client, database, collection, document (via bsoncxx).
Conexão e Obtenção da Coleção
#include <ios