Работа с базами данных в C++: PostgreSQL и MongoDB

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с базами данных в C++: PostgreSQL и MongoDB

Современные приложения на C++ редко обходятся без взаимодействия с базами данных. Независимо от того, разрабатываете ли вы высоконагруженный сервер, систему аналитики или встраиваемое ПО, умение работать с реляционными (PostgreSQL) и документо-ориентированными (MongoDB) СУБД — обязательный навык. В этой статье мы разберём подключение, выполнение запросов и обработку ошибок для обеих систем на практических примерах.

1. Подготовка среды и выбор библиотек

Для работы с PostgreSQL в C++ стандартом де-факто является библиотека libpqxx. Для MongoDB — официальный драйвер mongocxx (основанный на libmongoc).

Установка libpqxx (Linux / macOS)

# Ubuntu / Debian
sudo apt-get install libpqxx-dev

# macOS (Homebrew)
brew install libpqxx

Установка mongocxx (Linux / macOS)

# Требуется предварительно установить libmongoc и boost
sudo apt-get install libmongoc-1.0-0 libbson-1.0 libmongocxx-dev

# macOS
brew install mongo-cxx-driver

Для Windows используйте vcpkg или скачайте предкомпилированные сборки с официальных репозиториев.

2. Работа с PostgreSQL через libpqxx

Библиотека libpqxx предоставляет удобный C++-интерфейс поверх C-драйвера libpq. Основные классы: connection, work (транзакция), result.

Подключение к базе данных

#include <iostream>
#include <pqxx/pqxx>

int main() {
    try {
        // Строка подключения: "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;
}

Выполнение запросов (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);
    // Используем параметризованный запрос для защиты от SQL-инъекций
    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;
    }
}

Обработка ошибок

Все операции оборачивайте в try-catch. libpqxx генерирует исключения классов pqxx::sql_error, pqxx::broken_connection и другие.

3. Работа с MongoDB через mongocxx

Драйвер mongocxx использует современный C++17. Основные сущности: client, database, collection, document (через bsoncxx).

Подключение и получение коллекции

#include <iostream>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>

int main() {
    // Инициализация драйвера (один раз на весь процесс)
    mongocxx::instance inst{};
    
    // Подключение к локальному серверу MongoDB
    mongocxx::client conn{mongocxx::uri{"mongodb://localhost:27017"}};
    auto db = conn["testdb"];
    auto collection = db["users"];
    
    std::cout << "Connected to MongoDB." << std::endl;
    return 0;
}

CRUD-операции с документами

void insertDocument(mongocxx::collection &coll, const std::string &name, const std::string &email, int age) {
    using bsoncxx::builder::stream::document;
    using bsoncxx::builder::stream::open_document;
    using bsoncxx::builder::stream::close_document;
    using bsoncxx::builder::stream::finalize;

    auto doc = document{} << "name" << name
                          << "email" << email
                          << "age" << age
                          << finalize;
    
    auto result = coll.insert_one(doc.view());
    if (result) {
        std::cout << "Inserted with _id: " << result->inserted_id().get_oid().value.to_string() << std::endl;
    }
}

void findDocuments(mongocxx::collection &coll) {
    // Поиск всех документов с возрастом > 25
    using bsoncxx::builder::stream::document;
    using bsoncxx::builder::stream::finalize;

    auto filter = document{} << "age" << open_document << "$gt" << 25 << close_document << finalize;
    
    auto cursor = coll.find(filter.view());
    for (auto doc : cursor) {
        std::cout                

Блоги

Рекомендаций по книгам