PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara menyiapkan pernyataan dan mengikat parameter di Postgresql untuk C++

Contoh sederhana. Ini hanya mencetak jumlah entri dengan nilai id 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;
}

Fungsi w.prepared() agak berbelit-belit. Ini mirip dengan fungsi kari (kari) di haskell, karena di dalamnya mengambil parameter dan mengembalikan fungsi lain yang pada gilirannya mengambil parameter lain. Hal semacam itu.

Dokumentasi mengatakan:

Bagaimana Anda melewati parameter itu? C++ tidak memiliki cara yang baik untuk membiarkan Anda meneruskan jumlah variabel argumen yang tidak terbatas ke panggilan fungsi, dan kompiler tidak tahu berapa banyak yang akan Anda lewati. Ada trik untuk itu:Anda dapat memperlakukan nilai yang Anda dapatkan kembali dari disiapkan sebagai fungsi, yang Anda panggil untuk meneruskan parameter. Apa yang Anda dapatkan kembali dari panggilan itu adalah sama lagi, sehingga Anda dapat memanggilnya lagi untuk meneruskan parameter lain dan seterusnya.

Setelah Anda melewati semua parameter dengan cara ini, Anda memanggil pernyataan dengan parameter dengan memanggil exec pada permintaan

Jika ada lebih banyak parameter gunakan $1 $2 dan seterusnya di prepare fungsi.

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

dan berikan variabelnya sebagai

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

Contoh untuk persiapan dinamis

#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;
}

jika Anda ingin menangani tipe data lain gunakan definisi fungsi ini

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. PostgreSQL tidak dapat memulai/mengakhiri transaksi di PL/pgSQL

  2. Rencana Toko Kolom

  3. Webinar:Fitur Baru di Postgres 12 [Tindak lanjut]

  4. PostgreSQL, konfigurasi ulang tabel yang ada, ubah kunci utama menjadi type=serial

  5. Db berbeda untuk pengujian di Django?