Работа с базами данных в C++: PostgreSQL и MongoDB для начинающих

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

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

Начать курс

Введение: зачем C++ разработчику базы данных?

C++ — один из самых мощных языков программирования, используемый для создания высоконагруженных систем, игр, финансовых приложений и встраиваемого ПО. Однако любое серьезное приложение требует хранения данных. Именно здесь на помощь приходят системы управления базами данных (СУБД).

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

1. Подготовка окружения и выбор библиотек

Прежде чем писать код, необходимо установить клиентские библиотеки для работы с базами данных. Для C++ существует несколько вариантов, но мы рассмотрим самые популярные и стабильные:

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

Установка libpqxx (Ubuntu/Debian)

sudo apt-get update
sudo apt-get install libpqxx-dev

Для Windows или macOS используйте менеджеры пакетов vcpkg или Homebrew.

Установка mongocxx

Сначала установите базовый драйвер mongo-c-driver, затем C++ драйвер:

# Ubuntu
sudo apt-get install libmongoc-dev libbson-dev
sudo apt-get install libmongocxx-dev

После установки убедитесь, что компилятор видит заголовочные файлы. При компиляции не забудьте указать флаги линковки:

g++ -std=c++17 main.cpp -lpqxx -lpq -lmongocxx -lbson

2. Работа с PostgreSQL в C++

PostgreSQL — это мощная объектно-реляционная СУБД. Мы будем использовать библиотеку libpqxx, которая предоставляет удобный C++ интерфейс.

Подключение к серверу и создание таблицы

Сначала напишем простую программу, которая подключается к локальной базе данных и создает таблицу пользователей:

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

int main() {
    try {
        // Подключаемся к базе данных "testdb" от имени пользователя "postgres"
        pqxx::connection conn("host=localhost dbname=testdb user=postgres password=secret");
        if (conn.is_open()) {
            std::cout << "Подключение к PostgreSQL успешно!" << std::endl;
        }

        // Создаем транзакцию
        pqxx::work txn(conn);

        // SQL-запрос на создание таблицы
        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(); // Фиксируем изменения
        std::cout << "Таблица users создана." << std::endl;

    } catch (const std::exception &e) {
        std::cerr << "Ошибка: " << e.what() << std::endl;
    }
    return 0;
}

CRUD-операции: вставка и чтение данных

Добавим несколько записей и выполним выборку:

pqxx::work txn(conn);

// Вставка данных
txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);",
                "Иван Петров", "ivan@example.com");
txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);",
                "Мария Смирнова", "maria@example.com");
txn.commit();

// Чтение данных
pqxx::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>()
              << ", Имя: " << row[1].as<std::string>()
              << ", Email: " << row[2].as<std::string>() << std::endl;
}

Обратите внимание: exec_params использует плейсхолдеры $1, $2 — это защищает от SQL-инъекций. Никогда не конкатенируйте строки напрямую!

Обновление и удаление

pqxx::work txn(conn);
// Обновление
txn.exec_params("UPDATE users SET email = $1 WHERE id = $2;",
                "ivan_new@example.com", 1);
// Удаление
txn.exec_params("DELETE FROM users WHERE name = $1;", "Мария Смирнова");
txn.commit();

3. Работа с MongoDB в C++

MongoDB — это NoSQL база данных, которая хранит данные в виде JSON-подобных документов. В C++ используется драйвер mongocxx.

Подключение и создание коллекции

MongoDB не требует предварительного создания таблиц (коллекций) — они создаются автоматически при вставке первого документа.

#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"}};

    // Выбираем базу данных "testdb" и коллекцию "users"
    auto db = conn["testdb"];
    auto collection = db["users"];

    std::cout << "Подключение к MongoDB успешно!" << std::endl;
    return 0;
}

Вставка и чтение документов

Используем BSON-билдер для создания документов:

using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::open_document;
using bsoncxx::builder::stream::close_document;
using bsoncxx::builder                

Блоги

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