如何在Postgresql for C++中准备语句和绑定参数

Jac*_*ian 6 c++ postgresql prepared-statement libpqxx

我很新,C++pqxx图书馆有点了解.我想要实现的是准备语句和绑定参数.在PHP我习惯这样一个漂亮和简洁的方式:

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

或使用令牌:

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

我试图从pqxx 文档中弄清楚如何实现这一点,但对我来说文档看起来像一团糟,缺少简短的例子(就像我上面提到的那样).我希望有人也可以提供这种简单的例子(或相当的简单-无需编写一些代码巨兽)以打交道时PostgresqlC++.

raj*_*kar 12

一个简单的例子.这只打印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;
}
Run Code Online (Sandbox Code Playgroud)

函数w.prepared()有点复杂.它类似于haskell中的curried(curry)函数,因为它接受一个参数并返回另一个函数,该函数又接受另一个参数.那种事.

文件说:

你如何通过这些参数?C++没有很好的方法让你将无限的,可变数量的参数传递给函数调用,并且编译器不知道你将传递多少.有一个技巧:你可以将你从准备好的值作为一个函数处理,你调用它来传递一个参数.你从该通话中得到的内容再次相同,所以你可以再次调用它来传递另一个参数,依此类推.

一旦以这种方式传递了所有参数,就可以通过在调用上调用exec来调用带有参数的语句

如果有更多参数,则在prepare函数中使用$ 1 $ 2等等.

c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")
Run Code Online (Sandbox Code Playgroud)

把变量作为

w.prepared("example")(dollar1_var)(dollar2_var).exec()
Run Code Online (Sandbox Code Playgroud)

动态准备的一个例子

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果要处理其他数据类型,请使用此函数定义

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;
}
Run Code Online (Sandbox Code Playgroud)