2017-03-07 8 views
0

CentOS 7.3にC++、Postgres、postgresql-develをインストールしました。私もlibpqxx-4.0をインストールしました。データベース認証でパスワードが必要な場合、pqxx(Postgres用C++ API)を動作させるにはどうすればよいですか?

私はこのadd_employee.cxxファイルを作成し、それを「簡単な例」hereに基づいて作成しました。私は./a.out走ってこれを見た

c++ add_employee.cxx -lpqxx -lpq 

は 「pqxxのインスタンスを投げた後に呼び出さTERMINATE :: broken_connection

#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(); 
} 

私はこれでそれをコンパイル'what():致命的:ピア認証 がユーザー "foobar"に失敗しました

中止

通常、データベースの役割「jdoe」のログインにはパスワードが必要です。エラーを回避するにはどうすればよいですか?私は自動的にC++プログラムのログインをしたい。私はデータベースにパスワードなしの認証を持っていません。このC++プログラムをパスワードを要求してもPostgresデータベースに記録する方法はありますか?

答えて

1

これはあなたのC++コードとはあまり関係がないと思われます。さらに、あなたはサーバーがセットアップされています。

APIアクセスは常にネットワーク経由で行われるので、pg_hba.confファイルが正しいことを確認してください。

同じ方法で同じローカルネットワーク上の別のマシンからのアクセスをテストすると便利です。

+0

私のpg_hba.confファイルが正しく設定されていると思います。私は1台のサーバーにPostgresを持っています。私はこれをローカルでやろうとしています。別のマシンからどうやって試してみるか教えていただけますか?それは私のローカル試みから新しい複雑さを導入するでしょう。 – Alex111

+0

私は 'psql'は同じマシン_がソケットを使うので有効なテストではないことを発見しました。 _another machine_に 'psql'を使うことは、あなたのC++コードが使うものであるtcp/ipを使うので、有効なテストです。だから、ホスト引数を使って明示的に指し示す別のマシンから試してみると、私は過去に助けになりました。 –

+0

そして、マシン_laptop_からマシン_server_に再試行しました。 'psql'以外にも私はデーモンとidentデーモンをインストールしなければならず、' pg_hba.conf'にはローカルネットワーク用のidentが設定されています。その後、それはすごくうまくいく。サーバー自体のプログラムによるアクセスも同様です。 –

関連する問題