Приходилось ли писать SQL-запросы в C++ проектах?

«Приходилось ли писать SQL-запросы в C++ проектах?» — вопрос из категории Базы данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в C++ проектах я часто писал SQL-запросы для работы с реляционными базами данных. Основной опыт связан с использованием нативных C/C++ API, таких как SQLite3, MySQL Connector/C++ и ODBC.

Пример работы с SQLite3 в C++:

#include <sqlite3.h>
#include <iostream>
#include <string>

int main() {
    sqlite3* db;
    sqlite3_open("test.db", &db);

    const char* sql = "SELECT id, name FROM users WHERE age > ?;";
    sqlite3_stmt* stmt;

    if (sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
        sqlite3_bind_int(stmt, 1, 18); // Привязка параметра

        while (sqlite3_step(stmt) == SQLITE_ROW) {
            int id = sqlite3_column_int(stmt, 0);
            const unsigned char* name = sqlite3_column_text(stmt, 1);
            std::cout << "ID: " << id << ", Name: " << name << std::endl;
        }
        sqlite3_finalize(stmt);
    } else {
        std::cerr << "Failed to prepare statement: " << sqlite3_errmsg(db) << std::endl;
    }
    sqlite3_close(db);
    return 0;
}

С чем работал:

  • Сложные запросы: JOIN (INNER, LEFT), GROUP BY с агрегатными функциями, подзапросы.
  • Оптимизация: Использование индексов, анализ планов выполнения (EXPLAIN QUERY PLAN в SQLite).
  • Безопасность: Всегда использовал параметризованные запросы (как в примере с ?) для предотвращения SQL-инъекций.
  • Интеграция: Для сложной бизнес-логики иногда использовал ORM вроде ODB или выносил логику в хранимые процедуры на стороне СУБД (например, в PostgreSQL).