извлечь данные из таблицы MariaDB и записать их в структуру

Ответить
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

извлечь данные из таблицы MariaDB и записать их в структуру

Сообщение ya »

Установите MySQL Connector/C++

Код: Выделить всё

sudo apt-get install libmysqlcppconn-dev
fetch_data.cpp

Код: Выделить всё

#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/statement.h>
#include <cppconn/resultset.h>
#include <iostream>
#include <vector>

// Определяем структуру для хранения данных
struct MyData {
    int id;
    std::string name;
    double value;
};

// Функция для извлечения данных из базы данных
std::vector<MyData> fetchData() {
    std::vector<MyData> data;
    try {
        // Создание драйвера подключения
        sql::mysql::MySQL_Driver *driver;
        sql::Connection *con;

        // Подключение к базе данных
        driver = sql::mysql::get_mysql_driver_instance();
        con = driver->connect("tcp://127.0.0.1:3306", "user", "password");  // Замените 'user' и 'password' на ваши данные
        
        // Выбор базы данных
        con->setSchema("database_name");  // Замените 'database_name' на имя вашей базы данных

        // Создание запроса
        sql::Statement *stmt = con->createStatement();
        sql::ResultSet *res = stmt->executeQuery("SELECT id, name, value FROM my_table");  // Замените 'my_table' на вашу таблицу

        // Чтение данных и запись в структуру
        while (res->next()) {
            MyData record;
            record.id = res->getInt("id");
            record.name = res->getString("name");
            record.value = res->getDouble("value");
            data.push_back(record);
        }

        // Освобождение ресурсов
        delete res;
        delete stmt;
        delete con;
    } catch (sql::SQLException &e) {
        std::cerr << "SQL error: " << e.what() << std::endl;
    }

    return data;
}

int main() {
    std::vector<MyData> data = fetchData();

    // Вывод извлеченных данных
    for (const auto &record : data) {
        std::cout << "ID: " << record.id << ", Name: " << record.name << ", Value: " << record.value << std::endl;
    }

    return 0;
}
Скомпилируйте программу с помощью g++:

Код: Выделить всё

g++ -std=c++11 -o fetch_data fetch_data.cpp -lmysqlcppconn
Не забудьте заменить user, password, database_name и my_table на ваши реальные данные для подключения к базе данных и таблицы.
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: извлечь данные из таблицы MariaDB и записать их в структуру

Сообщение ya »

Код: Выделить всё

sudo apt-get install libmariadb-dev libmariadb-dev-compat

Код: Выделить всё

#include <iostream>
#include <mysql/mysql.h>

class Database {
public:
    static Database& getInstance() {
        static Database instance; // Инициализация одиночки
        return instance;
    }

    bool connect(const char* host, const char* user, const char* password, const char* db_name) {
        conn = mysql_init(nullptr);
        if (conn == nullptr) {
            std::cerr << "mysql_init() failed
";
            return false;
        }

        if (mysql_real_connect(conn, host, user, password, db_name, 0, nullptr, 0) == nullptr) {
            std::cerr << "mysql_real_connect() failed
";
            mysql_close(conn);
            return false;
        }
        return true;
    }

    void executeQuery(const char* query) {
        if (mysql_query(conn, query)) {
            std::cerr << "QUERY FAILED: " << mysql_error(conn) << std::endl;
        } else {
            MYSQL_RES *res = mysql_store_result(conn);
            if (res) {
                MYSQL_ROW row;
                while ((row = mysql_fetch_row(res))) {
                    for (unsigned int i = 0; i < mysql_num_fields(res); i++) {
                        std::cout << (row[i] ? row[i] : "NULL") << "\t";
                    }
                    std::cout << std::endl;
                }
                mysql_free_result(res);
            }
        }
    }

    ~Database() {
        if (conn) {
            mysql_close(conn);
        }
    }

private:
    Database() : conn(nullptr) {} // Приватный конструктор
    Database(const Database&) = delete; // Запрет копирования
    Database& operator=(const Database&) = delete; // Запрет присваивания

    MYSQL *conn;
};

Код: Выделить всё

int main() {
    Database& db = Database::getInstance();
    
    if (!db.connect("localhost", "user", "password", "database_name")) {
        return EXIT_FAILURE;
    }

    // Пример запроса к базе данных
    db.executeQuery("SELECT * FROM your_table;");
    
    return EXIT_SUCCESS;
}

Код: Выделить всё

find /usr/include -name mysql.h

Код: Выделить всё

g++ -std=c++11 -o db_example db_example.cpp -lmariadb

Код: Выделить всё

g++ -std=c++11 -o webs5 webs5.cpp -I/usr/include/mariadb/mysql -L/usr/lib/mysql -lmariadb -lmysqlcppconn -lmysqlclient_r
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: извлечь данные из таблицы MariaDB и записать их в структуру

Сообщение ya »

Для получения данных из базы данных MariaDB и записи их в ассоциативный массив (вектор векторов или словарь), нужно внести изменения в вашу функцию executeQuery. Вместо вывода данных на консоль, мы будем сохранять их в структуру данных для дальнейшего использования. В C++ для реализации ассоциативного массива чаще всего используют std::map или std::unordered_map.

чтобы она сохраняла данные в std::unordered_map, где ключи представляют собой названия колонок, а значения - векторы, содержащие строки данных из этих колонок.

Код: Выделить всё

#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <mysql/mysql.h>

MYSQL *conn; // Предположим, что соединение с базой данных уже инициализировано

void executeQuery(const char* query, std::unordered_map<std::string, std::vector<std::string>>& data) {
    if (mysql_query(conn, query)) {
        std::cerr << "QUERY FAILED: " << mysql_error(conn) << std::endl;
    } else {
        MYSQL_RES *res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            unsigned int num_fields = mysql_num_fields(res);
            MYSQL_FIELD *fields = mysql_fetch_fields(res); // Получаем метаданные колонок

            // Инициализируем векторы для каждого поля
            for (unsigned int i = 0; i < num_fields; i++) {
                data[fields[i].name] = std::vector<std::string>();
            }

            while ((row = mysql_fetch_row(res))) {
                for (unsigned int i = 0; i < num_fields; i++) {
                    // Заполняем векторы соответствующими значениями
                    if (row[i]) {
                        data[fields[i].name].push_back(row[i]);
                    } else {
                        data[fields[i].name].push_back("NULL");
                    }
                }
            }
            mysql_free_result(res);
        }
    }
}

// Пример использования
int main() {
    // Инициализация соединения и подключение к базе данных здесь...

    std::unordered_map<std::string, std::vector<std::string>> resultData;
    const char* query = "SELECT * FROM your_table"; // Замените на свой запрос
    executeQuery(query, resultData);

    // Пример вывода результатов
    for (const auto& [key, values] : resultData) {
        std::cout << key << ": ";
        for (const auto& value : values) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }

    // Освобождение ресурсов и завершение работы с базой данных здесь...

    return 0;
}
Структура данных: Мы используем std::unordered_map<std::string, std::vector<std::string>>, где ключ - это название колонки, а значение - вектор строк, содержащий данные из этой колонки.

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

Заполнение данных: Внутренний цикл обрабатывает каждую строку результата и заполняет соответствующие векторы данными.

Вывод результатов: В конце мы выводим результат, показывая все данные в удобочитаемом формате.
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: извлечь данные из таблицы MariaDB и записать их в структуру

Сообщение ya »

mariadb.hpp

Код: Выделить всё

//#include <iostream>
//#include <mutex>
//#include <path-spec>
//#include <mysql/mysql.h>
//#include <mysql_driver.h>
//#include <mysql_connection.h>
//#include <cppconn/statement.h>
//#include <cppconn/resultset.h>


#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <mysql/mysql.h>

// Структура подключения к базе данных mariadb    
  /*  struct sqlDB
    {
        std::string sql_host = "localhost";
        std::string sql_login = "";
        std::string sql_passwd = "";
        std::string sql_db = "webs5";
    };
    */


class Database {
public:
    static Database& getInstance() {
        static Database instance; // Инициализация одиночки
        return instance;
    }

    bool connect(const char* host, const char* user, const char* password, const char* db_name) {
        conn = mysql_init(nullptr);
        if (conn == nullptr) {
            std::cerr << "mysql_init() failed";
            return false;
        }

        if (mysql_real_connect(conn, host, user, password, db_name, 0, nullptr, 0) == nullptr) {
            std::cerr << "mysql_real_connect() failed";
            mysql_close(conn);
            return false;
        }
        return true;
    }

    void executeQuery(const char* query) {
        if (mysql_query(conn, query)) {
            std::cerr << "QUERY FAILED: " << mysql_error(conn) << std::endl;
        } else {
            MYSQL_RES *res = mysql_store_result(conn);
            if (res) {
                MYSQL_ROW row;
                while ((row = mysql_fetch_row(res))) {
                    for (unsigned int i = 0; i < mysql_num_fields(res); i++) {
                        std::cout << (row[i] ? row[i] : "NULL") << "\t";
                    }
                    std::cout << std::endl;
                }
                mysql_free_result(res);
            }
        }
    }


    
void executeQuery_select(const char* query, std::unordered_map<std::string, std::vector<std::string>>& data) {
    if (mysql_query(conn, query)) {
        std::cerr << "QUERY FAILED: " << mysql_error(conn) << std::endl;
    } else {
        MYSQL_RES *res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            unsigned int num_fields = mysql_num_fields(res);
            MYSQL_FIELD *fields = mysql_fetch_fields(res); // Получаем метаданные колонок

            // Инициализируем векторы для каждого поля
            for (unsigned int i = 0; i < num_fields; i++) {
                data[fields[i].name] = std::vector<std::string>();
            }

            while ((row = mysql_fetch_row(res))) {
                for (unsigned int i = 0; i < num_fields; i++) {
                    // Заполняем векторы соответствующими значениями
                    if (row[i]) {
                        data[fields[i].name].push_back(row[i]);
                    } else {
                        data[fields[i].name].push_back("NULL");
                    }
                }
            }
            mysql_free_result(res);
        }
    }
}    
    

    
    bool executeQuery_insert(const char* query) {
        if (mysql_query(conn, query)) {
            std::cerr << "Error: " << mysql_error(conn) << std::endl;
            return false;  // Запрос не выполнен успешно
        }
        return true;  // Запрос выполнен успешно
    }    
    
    
    
    
    
    ~Database() {
        if (conn) {
            mysql_close(conn);
        }
    }

private:
    Database() : conn(nullptr) {} // Приватный конструктор
    Database(const Database&) = delete; // Запрет копирования
    Database& operator=(const Database&) = delete; // Запрет присваивания

    MYSQL *conn;
};


int mariadb() {
    Database& db = Database::getInstance();
    sqlDB sql_init_struct;
    if (!db.connect(sql_init_struct.sql_host.c_str(), sql_init_struct.sql_login.c_str(), sql_init_struct.sql_passwd.c_str(), sql_init_struct.sql_db.c_str())) {
        return EXIT_FAILURE;
    }

    // Пример запроса к базе данных
    //db.executeQuery("SELECT * FROM your_table;");
    
    //std::unordered_map<std::string, std::vector<std::string>> resultData;
    //const char* query = "SELECT * FROM your_table"; // Замените на свой запрос
    //db.executeQuery_select(query, resultData);

    // Пример вывода результатов
    //for (const auto& [key, values] : resultData) {
    //    std::cout << key << ": ";
    //    for (const auto& value : values) {
    //        std::cout << value << " ";
    //    }
    //    std::cout << std::endl;
    //}

        // Создаем пример данных
//     std::unordered_map<std::string, std::vector<std::string>> resultData = {
//         {"key1", {"value1a", "value1b"}},
//         {"key2", {"value2a"}},
//         {"key3", {"value3a", "value3b", "value3c"}}
//     };

    
    
    
    return EXIT_SUCCESS;
}
Ответить