如何为libpqxx / C ++在准备好的SQL语句中将引号内的参数绑定

时间:2018-12-12 02:14:59

标签: c++ postgresql prepared-statement postgis libpqxx

我有一个PostGIS扩展的PotgreSQL数据库,并且我想知道如何使用db.users.dropIndex('privileges.region_1') 通过PostGIS函数(例如pqxx::connection_base::prepare)创建一个SQL语句。

当我这样查询PostgreSQL的SQL状态时:

st_distance()

我得到答复:

database_name=# select st_geomfromtext('POINT(50.0 90.0)', 4326);

如何使用C ++在libpqxx上获取以上代码?

我尝试过:

                  st_geomfromtext
----------------------------------------------------
 0101000020E610000000000000000049400000000000805640

但是得到了错误:

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

int main()
{
    try {
        pqxx::connection conn("dbname=xxx user=yyy password=zzz");
        pqxx::work xaction(conn);

        conn.prepare(
            "text to geometry point",
            "select st_geomfromtext('POINT($1 $2)', 4326);"
        );
        pqxx::result selected = xaction.prepared("text to geometry point")(50.0)(90.0).exec();

        for (auto row : selected) {
            for (auto col : row) {
                std::cout << col.c_str() << "\t";
            }
            std::cout << "\n";
        }
        std::cout << std::endl;
        conn.disconnect();
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

libpqxx可能无法解析ERROR: bind message supplies 2 parameters, but prepared statement "text to geometry point" requires 0 ,因为其中的参数用引号引起来,因此绑定参数失败。

我不知道要解决此错误。

这是我想要做的简单示例。我需要在实际工作中使用'POINT($1 $2)'

1 个答案:

答案 0 :(得分:0)

$1不会解释为参数,而是解释为字符串文字,因为它位于单引号内。

尝试

'POINT(' || $1 || ' ' || $2 || ')'