簡単な例。これは、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;
}
関数 w.prepared() は少し複雑です。Haskell の curried(curry) 関数に似ています。パラメーターを受け取り、別の関数を返し、別のパラメーターを受け取ります。そういうこと。
ドキュメントには次のように記載されています。
これらのパラメータをどのように渡しますか? 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;
}