2017-03-07 24 views
0

我在CentOS 7.3上安装了C++,Postgres和postgresql-devel。我也安装了libpqxx-4.0。如何在我的数据库身份验证需要密码时使pqxx(Postgres的C++ API)正常工作?

然后我创建了这个add_employee.cxx文件,并基于它的“简单示例”here

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

int main(int, char *argv[]) 
{ 
    pqxx::connection c("dbname=foobar user=jdoe password=smartpassword"); 
    pqxx::work txn(c); 

    pqxx::result r = txn.exec(
    "SELECT id " 
    "FROM Employee " 
    "WHERE name =" + txn.quote(argv[1])); 

    if (r.size() != 1) 
    { 
    std::cerr 
     << "Expected 1 employee with name " << argv[1] << ", " 
     << "but found " << r.size() << std::endl; 
    return 1; 
    } 

    int employee_id = r[0][0].as<int>(); 
    std::cout << "Updating employee #" << employee_id << std::endl; 

    txn.exec(
    "UPDATE EMPLOYEE " 
    "SET salary = salary + 1 " 
    "WHERE id = " + txn.quote(employee_id)); 

    txn.commit(); 
} 

我这个编译它:

c++ add_employee.cxx -lpqxx -lpq 

我./a.out跑,看到这一点:

终止叫做抛出的 “pqxx :: broken_connection的实例后'什么():致命:对等身份验证 用户“foobar”失败

异常终止

我通常需要密码才能登录数据库角色“jdoe”。我该如何解决错误?我想要一个C++程序自动登录。我没有对数据库进行无密码验证。有没有办法让这个C++程序尽管需要密码登录到Postgres数据库?

回答

1

我怀疑这与你的C++代码没什么关系,并且你的服务器设置的更多。

我记得,API访问总是通过网络,所以确保你pg_hba.conf文件是正确的。

我发现对测试有用的一种方法是:从同一本地网络上的另一台计算机进行访问。

+0

我想我的pg_hba.conf文件设置正确。我有一台服务器上的Postgres。我试图在本地做到这一点。你能详细说明我将如何从另一台机器上尝试吗?这将从我本地的尝试中引入新的复杂性。 – Alex111

+0

我发现'psql' _在同一台机器上不是一个有效的测试,因为它使用套接字。在另一台机器上使用'psql'是一个有效的测试,因为它将使用tcp/ip,这就是你的C++代码将使用的。所以,从另一台机器上尝试,通过主机参数明确指出,帮助我过去。 –

+0

而我刚刚从机器_laptop_再次尝试机器_server_。除'psql'之外,我还必须安装ident和daemon,并且我的'pg_hba.conf'拥有本地网络的ident集。在那之后......这一切都很顺利。与服务器本身的程序化访问一样。 –

相关问题