blog

PostgreSQL接続C/C++インターフェースの例

このチュートリアルでは、接続用の公式C++クライアントAPIであるlibpqxxライブラリを使用したC/C++接続について説明します。libpqxxのソースコードはBSDライセンスの下で利用可能であり...

Dec 21, 2017 · 8 min. read
シェア

このチュートリアルでは、PostgreSQLに接続するための公式のC++クライアントAPIであるlibpqxxライブラリを使用したC/C++によるPostgreSQLへの接続について説明します。libpqxxのソースコードはBSDライセンスの下で利用可能であり、自由にダウンロードしたり、他の人に渡したり、変更したり、販売したりすることができます。

取付

wget http://.org/download/software/libpqxx/libpqxx-...gz 
tar xvfz libpqxx-4.0.tar.gz 
cd libpqxx-4.0 
./configure 
make 
make install 

Getting Started with C/C++ PostgreSQLインタフェースで、PostgreSQLのインストールディレクトリを探し、pg_hba.confファイルに以下の行を追加してください:

# IPv4 local connections: 
host    all         all         .1/32          md5 

Postgresサーバーが起動していない場合は、以下のコマンドで起動/再起動できます:

[root@host]# service postgresql restart 
Stopping postgresql service:                               [  OK  ] 
Starting postgresql service:      

C/C++ API

C/C++プログラムでPostgreSQLデータベースを扱うニーズを満たすために、以下の重要なインタフェースルーチンが用意されています。より複雑なアプリケーションを求めるのであれば、公式のlibpqxxドキュメントを参照するか、商用のAPIを使用してください。

データベースへの接続

以下のCコード・スニペットは、ローカル・マシンでポート5432を実行して既存のデータベースに接続する方法を示しています。この行は、ここではスラッシュで続けられています。

#include <iostream> 
#include <pqxx/pqxx>  
 
using namespace std; 
using namespace pqxx; 
 
int main(int argc, char* argv[]) 
{ 
   try{ 
      connection C("dbname=testdb user=postgres password=cohondob \ 
      hostaddr=.1 port=5432"); 
      if (C.is_open()) { 
         cout << "Opened database successfully: " << C.dbname() << endl; 
      } else { 
         cout << "Can't open database" << endl; 
         return 1; 
      } 
      C.disconnect (); 
   }catch (const std::exception &e){ 
      cerr << e.what() << std::endl; 
      return 1; 
   } 
} 

では、ユーザーpostgresとパスワードpass123を使用して、データベースtestdbへの接続にアクセスするために、上記のプログラムをコンパイルして実行してみましょう。 ユーザーIDとパスワードには、データベース・ベースの設定を使用できます。lpqxxと-plqを指定された順序で使用し続けることを忘れないでください!そうしないと、リンカは "pq "で始まる関数名がないかどうかプロンプトを表示します。

$g++ test.cpp -lpqxx -lpq 
$./a.out 
Opened database successfully: testdb 

#p#

テーブルの作成

次のCコード・スニペットは、以前に作成したデータベースにテーブルを作成するために使用されます:

#include <iostream> 
#include <pqxx/pqxx>  
 
using namespace std; 
using namespace pqxx; 
 
int main(int argc, char* argv[]) 
{ 
   char * sql; 
    
   try{ 
      connection C("dbname=testdb user=postgres password=cohondob \ 
      hostaddr=.1 port=5432"); 
      if (C.is_open()) { 
         cout << "Opened database successfully: " << C.dbname() << endl; 
      } else { 
         cout << "Can't open database" << endl; 
         return 1; 
      } 
      /* Create SQL statement */ 
      sql = "CREATE TABLE COMPANY("  \ 
      "ID INT PRIMARY KEY     NOT NULL," \ 
      "NAME           TEXT    NOT NULL," \ 
      "AGE            INT     NOT NULL," \ 
      "ADDRESS        CHAR(50)," \ 
      "SALARY         REAL );"; 
 
      /* Create a transactional object. */ 
      work W(C); 
       
      /* Execute SQL query */ 
      W.exec( sql ); 
      W.commit(); 
      cout << "Table created successfully" << endl; 
      C.disconnect (); 
   }catch (const std::exception &e){ 
      cerr << e.what() << std::endl; 
      return 1; 
   } 
 
   return 0; 
} 

上記のプログラムがコンパイルされ実行されると、testdbデータベースにCOMPANYテーブルが作成され、以下のステートメントが表示されます:

Opened database successfully: testdb 
Table created successfully 

挿入操作

次のCコード・スニペットは、上記の例でCOMPANYテーブルのレコードを作成する方法を示しています:

#include <iostream> 
#include <pqxx/pqxx>  
 
using namespace std; 
using namespace pqxx; 
 
int main(int argc, char* argv[]) 
{ 
   char * sql; 
    
   try{ 
      connection C("dbname=testdb user=postgres password=cohondob \ 
      hostaddr=.1 port=5432"); 
      if (C.is_open()) { 
         cout << "Opened database successfully: " << C.dbname() << endl; 
      } else { 
         cout << "Can't open database" << endl; 
         return 1; 
      } 
      /* Create SQL statement */ 
      sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \ 
      "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \ 
      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \ 
      "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \ 
      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ 
      "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \ 
      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ 
      "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; 
 
      /* Create a transactional object. */ 
      work W(C); 
       
      /* Execute SQL query */ 
      W.exec( sql ); 
      W.commit(); 
      cout << "Records created successfully" << endl; 
      C.disconnect (); 
   }catch (const std::exception &e){ 
      cerr << e.what() << std::endl; 
      return 1; 
   } 
 
   return 0; 
} 

上記のプログラムをコンパイルして実行すると、COMPANYテーブルにレコードが作成され、以下の2行が表示されます:

Opened database successfully: testdb 
Records created successfully 
Read next

NodeJsで空でないフォルダを削除する3つの方法

fsはfilesystemの略で、nodeに付属するI/Oモジュールで、ローカルファイルの読み書きに使われ、すべてのAPIが非同期と同期の両方で利用できます。ファイルを削除するメソッドはfs.rmdir(path, callback)で、その同期バージョンはfs.rmdirSync(path)ですが、一つ問題なのは、空のフォルダしか削除できず、空でないフォルダに対しては何もできないことです。nodejsを使って空でないフォルダを削除する3つの方法を紹介します。https://g。

Dec 20, 2017 · 4 min read