Приходилось ли писать SQL-запросы в 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).

Ответ 18+ 🔞

Да ты посмотри, какие запросы я на C++ писал, ёпта! Прямо овердохуища работы было с базами данных. В основном, конечно, через нативные API — SQLite3 там, MySQL Connector/C++ или вот этот старый добрый ODBC, который, как мартышлюшка, везде пролезет.

Вот, смотри, как с SQLite3 обычно работал:

#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'ы, GROUP BY с кучей функций — обычное дело. Иногда такой запрос напишешь, что сам от себя охуеваешь, как оно работает.
  • Оптимизация: Тут без мозгов никак. Индексы настраивал, планы выполнения смотрел, чтобы всё летало, а не ползало, как черепаха.
  • Безопасность, ёпта! Это святое. Только параметризованные запросы, как в примере. Доверия ебать ноль любым пользовательским данным, поэтому SQL-инъекции у меня просто не прокатывали.
  • Интеграция: Для особо хитрожопой логики иногда брал ORM вроде ODB, а то и вовсе выносил всё в хранимые процедуры на стороне базы, особенно с PostgreSQL. Главное — чтобы работало, и чтобы потом не пришлось всё это ебать-колотить переделывать.