Arhn - архитектура программирования

libpqxx v12 - динамически привязывать векторные значения к подготовленному оператору (альтернатива вызову)

Я хотел бы использовать подготовленные операторы для одновременной вставки тысяч строк в мою базу данных postgres. Данные для вставки хранятся в векторе структур.

Прочитав ответы на Как подготовить операторы и связывать параметры в Postgresql для C++ Я думал, что нашел способ, как это сделать.

К сожалению, текущая версия libpqxx, которую я использую, больше не поддерживает pqxx::prepare::invocation, и я не смог найти альтернативу в документации/интернете.

Код, который я пробовал для своей цели, следующий:

//pqxx header
#include "pqxx/connection.hxx" 
#include "pqxx/transaction.hxx"
#include "pqxx/nontransaction.hxx"
#include "pqxx/compiler-public.hxx"
#include "pqxx/result.hxx"
#include "pqxx/prepared_statement.hxx"
#include "pqxx/transaction_base.hxx"
#include "pqxx/internal/statement_parameters.hxx"

...
int main(){

    struct testData {
       string uuid;
       float rndNo;
       string timestamp;
    };

    vector<testData> dataBuffer;
    testData dbdata;

    string queryStr;
    const char* query;

    stringstream connStream;
    stringstream queryStream;

    string DB_NAME = "dbname";
    string DB_USER = "postgres";
    string DB_PASSWORD = "password";
    string DB_HOSTADDR = "127.0.0.1";
    string DB_PORT = "1234";
    string DB_SCHEMA = "test_schema";
    string tableName = "test_table";

    //Create Random data 

    for (int i = 0; i < 100000; i++) {

        dbdata.uuid = "fe2b22ba-6ce7-4bbc-8226-d7696fe7a047";
        dbdata.rndNo = i / 3.123;
        dbdata.timestamp = systemDateTimeSQLFormat(0);

        dataBuffer.push_back(dbdata);
    }

    stringstream connStream;
    connStream << "dbname = " << DB_NAME << " user = " << DB_USER << " password = " << DB_PASSWORD << " hostaddr = " << DB_HOSTADDR << " port = " << DB_PORT;

    connection dbConn(connStream.str());
    if (dbConn.is_open()) {
        cout << "Opened database successfully: " << dbConn.dbname() << endl;
    }
    else {
        cout << "Can't open database" << endl;
        return;
    }


    pqxx::nontransaction W(dbConn);
    std::string m_insertCommand = "INSERT INTO test_schema.test_table (column1, column2, column3) VALUES";

    int buffSize = dataBuffer.size();

    for (size_t i = 0; i < buffSize; i++)
    {
        unsigned int countOf$ = i * 3;
        for (unsigned int i = 0; i < 3; ++i)
        {
            if (i == 0)
            {
                m_insertCommand += "(";
            }
            else
            {
                m_insertCommand += ", ";
            }
            m_insertCommand += "$";
            std::stringstream ss;
            ss << countOf$ + i + 1;
            m_insertCommand += ss.str();
        }
        if (i < buffSize - 1)
            m_insertCommand += ") ,";
    }
    m_insertCommand += ")";


    //FOLLOWING CODE NOT POSSIBLE WITH libpqxx v12

    dbConn.prepare("insert_into_db", m_insertCommand);
    pqxx::prepare::invocation = W.exec_prepared("insert_into_db");  //prepare doesn't have a member "invocation"


    for (size_t i = 0; i < buffSize; i++)
    {
        inv(dataBuffer.at(i).rndNo)(dataBuffer.at(i).timestamp)(dataBuffer.at(i).uuid); //inv not defined
    }

    inv.exec();

return 1;
}

  • Является ли C++ обязательным? Или вы можете использовать другой язык? 14.09.2020
  • Нет, С++ является обязательным. 14.09.2020
  • В в документации в списке устаревших указано: Класс pqxx::prepare::invocation — Начиная с версии 6.0, используйте transaction_base::exec_prepared и друзья. Это помогает? 14.09.2020
  • @LaurenzAlbe спасибо - я тоже нашел это. Но я не смог найти пример того, как его использовать в моем случае. Не удалось запустить его. 14.09.2020

Ответы:


1

pqxx::prepare::make_dynamic_params, вероятно, решит вашу проблему. Это решило мою проблему. Используйте этот способ:

for (size_t i = 0; i < buffSize; ++i)
{
    auto element = dataBuffer.at(i);
    vector<string> vect;
    vect.reserve(3);
    vect.push_back(pqxx::to_string(element.rndNo));
    vect.push_back(element.timestamp);
    vect.push_back(element.uuid);

    work.exec_params(m_insertCommand, pqxx::prepare::make_dynamic_params(vect));
}
27.03.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..