7

私はかなり新しく、ライブラリC++について少し知っています。pqxx実装したいのは、ステートメントを準備してパラメーターをバインドすることです。PHP私はこれをとても素晴らしく簡潔な方法で行うことに慣れています:

$s = $db->prepare("SELECT id FROM mytable WHERE id = :id");
$s->bindParam(':id', $id);
$s->execute();

またはトークンを使用する:

$data = array();
$data[] = 1;
$data[] = 2;
$s = $db->prepare("SELECT id FROM mytable WHERE id = ? or id = ?");
$s->execute($data);

pqxx のドキュメントからこれを実装する方法を見つけようとしましたが、ドキュメントは混乱しているように見え、短くて簡単な例が欠けています (上記で提供したように)。を扱うときに、誰かがそのような単純な例(または同等の単純さ-巨大なコードを書く必要なし)も提供できることを願っていPostgresqlますC++.

4

2 に答える 2

15

簡単な例。これは、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;
}
于 2015-08-07T19:05:38.443 に答える