Introdução: por que um desenvolvedor C++ precisa de banco de dados?
C++ é uma das linguagens de programação mais poderosas, usada para criar sistemas de alta carga, jogos, aplicações financeiras e software embarcado. No entanto, qualquer aplicação séria requer armazenamento de dados. É aqui que entram os sistemas de gerenciamento de banco de dados (SGBD).
Neste artigo, vamos analisar como conectar e executar operações básicas com dois SGBDs populares — o relacional PostgreSQL e o orientado a documentos MongoDB — usando C++. O material é voltado para desenvolvedores iniciantes que já conhecem os fundamentos de C++, mas ainda não trabalharam com bancos de dados. Você aprenderá como instalar as bibliotecas necessárias, escrever consultas CRUD simples e evitar erros típicos.
1. Preparação do ambiente e escolha das bibliotecas
Antes de escrever código, é necessário instalar as bibliotecas cliente para trabalhar com bancos de dados. Para C++, existem várias opções, mas vamos considerar as mais populares e estáveis:
- Para PostgreSQL —
libpqxx(wrapper oficial em C++ sobre libpq). - Para MongoDB —
mongocxx(driver oficial em C++ da MongoDB).
Instalação do libpqxx (Ubuntu/Debian)
sudo apt-get updatesudo apt-get install libpqxx-devPara Windows ou macOS, use gerenciadores de pacotes vcpkg ou Homebrew.
Instalação do mongocxx
Primeiro, instale o driver base mongo-c-driver, depois o driver C++:
# Ubuntusudo apt-get install libmongoc-dev libbson-devsudo apt-get install libmongocxx-devApós a instalação, certifique-se de que o compilador encontra os arquivos de cabeçalho. Ao compilar, não se esqueça de especificar as flags de linkagem:
g++ -std=c++17 main.cpp -lpqxx -lpq -lmongocxx -lbson2. Trabalhando com PostgreSQL em C++
PostgreSQL é um poderoso SGBD objeto-relacional. Usaremos a biblioteca libpqxx, que fornece uma interface C++ conveniente.
Conexão ao servidor e criação de tabela
Primeiro, vamos escrever um programa simples que se conecta a um banco de dados local e cria uma tabela de usuários:
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Conecta ao banco de dados "testdb" como usuário "postgres" pqxx::connection conn("host=localhost dbname=testdb user=postgres password=secret"); if (conn.is_open()) { std::cout << "Conexão ao PostgreSQL bem-sucedida!" << std::endl; }
// Cria uma transação pqxx::work txn(conn);
// Consulta SQL para criar tabela 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(); // Confirma as alterações std::cout << "Tabela users criada." << std::endl;
} catch (const std::exception &e) { std::cerr << "Erro: " << e.what() << std::endl; } return 0;}Operações CRUD: inserção e leitura de dados
Vamos adicionar alguns registros e realizar uma consulta:
pqxx::work txn(conn);
// Inserção de dadostxn.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();
// Leitura de dadospqxx::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>() << ", Nome: " << row[1].as<std::string>() << ", Email: " <<