PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да подготвим изрази и параметри за свързване в Postgresql за C++

Един прост пример. Това просто отпечатва броя на записите със стойност на идентификатор 0.

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

int main()
{
    std::string name = "name";
    int id = 0;
    try {
        //established connection to data base
        pqxx::connection c("dbname=mydb user=keutoi");
        pqxx::work w(c);
        //statement template
        c.prepare("example", "SELECT id  FROM mytable WHERE id = $1");
        //invocation as in varible binding
        pqxx::result r = w.prepared("example")(id).exec();
        
        w.commit();
        //result handling for accessing arrays and conversions look at docs
        std::cout << r.size() << std::endl;
    }
    catch(const std::exception &e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

Функцията w.prepared() е малко заплетена. Това е подобно на функцията curried(curry) в haskell, тъй като тя приема параметър и връща друга функция, която от своя страна приема друг параметър. Такива неща.

Документацията казва:

Как предавате тези параметри? C++ няма добър начин да ви позволи да предадете неограничен, променлив брой аргументи към извикване на функция и компилаторът не знае колко ще предадете. Има трик за това:можете да третирате стойността, която получавате от подготвена, като функция, която извиквате, за да предаде параметър. Това, което получавате от това повикване, отново е същото, така че можете да го извикате отново, за да предадете друг параметър и така нататък.

След като сте предали всички параметри по този начин, извиквате израза с параметрите, като извиквате exec при извикването

Ако има повече параметри, използвайте $1 $2 и така нататък в prepare функция.

c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")

и дайте променливите като

w.prepared("example")(dollar1_var)(dollar2_var).exec()

Пример за динамична подготовка

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

//Just give a vector of data you can change the template<int> to any data type
pqxx::prepare::invocation& prep_dynamic(std::vector<int> data, pqxx::prepare::invocation& inv)
{
    for(auto data_val : data)
        inv(data_val);
    return inv;
}

int main()
{
    std::string name = "name";

    //a data array to be used.
    std::vector<int> ids;
    ids.push_back(0);
    ids.push_back(1);

    try {
        pqxx::connection c("dbname=mydb user=keutoi");
        pqxx::work w(c);

        c.prepare("example", "SELECT id  FROM mytable WHERE id = $1 or id = $2");
        pqxx::prepare::invocation w_invocation = w.prepared("example");

        //dynamic array preparation
        prep_dynamic(ids, w_invocation);
        //executing prepared invocation.
        pqxx::result r = w_invocation.exec();

        w.commit();

        std::cout << r.size() << std::endl;
    }
    catch(const std::exception &e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

ако искате да обработвате други типове данни, използвайте тази дефиниция на функция

template<class T> pqxx::prepare::invocation& prep_dynamic(std::vector<T> data, pqxx::prepare::invocation& inv)
{
    for(auto data_val : data)
        inv(data_val);
    return inv;
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Изберете записи, където ВСИЧКИ съединени записи отговарят на някакво условие

  2. postgresql връща 0, ако върнатата стойност е нула

  3. Получаване на име на текущата функция вътре във функцията с plpgsql

  4. Архитектура и настройка на паметта в PostgreSQL бази данни

  5. Без диалектно съпоставяне за тип JDBC:2003