Postgresql-c-cpp
PostgreSQL-C/C ++インターフェイス
このチュートリアルでは、PostgreSQL用の公式C ++クライアントAPIである libpqxx ライブラリを使用します。 libpqxxのソースコードはBSDライセンスの下で利用できます。したがって、自由にダウンロードして他の人に渡したり、変更したり、販売したり、自分のコードに含めたり、選択した人と変更を共有したりできます。
インストール
libpqxxの最新バージョンは、リンクhttp://pqxx.org/download/software/libpqxx/[Libpqxxのダウンロード]からダウンロードできます。 だから、最新バージョンをダウンロードして、次の手順に従ってください-
wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.tar.gz
tar xvfz libpqxx-4.0.tar.gz
cd libpqxx-4.0
./configure
make
make install
C/C ++ PostgreSQLインターフェイスの使用を開始する前に、PostgreSQLインストールディレクトリで pg_hba.conf ファイルを見つけ、次の行を追加します-
# IPv4 local connections:
host all all 127.0.0.1/32 md5
次のコマンドを使用して、実行されていない場合にpostgresサーバーを起動/再起動できます-
[root@host]# service postgresql restart
Stopping postgresql service: [ OK ]
Starting postgresql service: [ OK ]
C/C ++インターフェイスAPI
以下は、C/C ++プログラムからPostgreSQLデータベースを操作するための要件を満たすことができる重要なインターフェイスルーチンです。 より高度なアプリケーションを探している場合は、libpqxxの公式ドキュメントを調べるか、市販のAPIを使用できます。
S. No. | API & Description |
---|---|
1 |
pqxx::connection C( const std::string & dbstring ) これは、データベースへの接続に使用されるtypedefです。 ここで、dbstringはdatbaseに接続するために必要なパラメーターを提供します(例: dbname = testdb user = postgres password = pass123 hostaddr = 127.0.0.1 port = 5432 )。 接続が正常にセットアップされると、さまざまな便利な関数public functionを提供する接続オブジェクトを使用してCが作成されます。 |
2 |
C.is_open() is_open()メソッドは接続オブジェクトのパブリックメソッドであり、ブール値を返します。 接続がアクティブな場合、このメソッドはtrueを返し、そうでない場合はfalseを返します。 |
3 |
C.disconnect() このメソッドは、開いているデータベース接続を切断するために使用されます。 |
4 |
pqxx::work W( C ) これはtypedefであり、接続Cを使用してトランザクションオブジェクトを作成するために使用され、最終的にはトランザクションモードでSQLステートメントを実行するために使用されます。 トランザクションオブジェクトが正常に作成されると、トランザクションオブジェクトに関連するパブリックメソッドへのアクセスに使用される変数Wに割り当てられます。 |
5 |
W.exec(const std::string & sql) トランザクションオブジェクトのこのパブリックメソッドは、SQLステートメントの実行に使用されます。 |
6 |
W.commit() トランザクションオブジェクトのこのパブリックメソッドは、トランザクションをコミットするために使用されます。 |
7 |
W.abort() トランザクションオブジェクトのこのパブリックメソッドは、トランザクションをロールバックするために使用されます。 |
8 |
pqxx::nontransaction N( C ) これは、接続Cを使用して非トランザクションオブジェクトを作成するために使用されるtypedefであり、最終的には非トランザクションモードでSQLステートメントを実行するために使用されます。 トランザクションオブジェクトが正常に作成されると、変数Nに割り当てられ、非トランザクションオブジェクトに関連するパブリックメソッドへのアクセスに使用されます。 |
9 |
N.exec(const std::string & sql) 非トランザクションオブジェクトからのこのパブリックメソッドは、SQLステートメントを実行するために使用され、返されたすべてのレコードを保持するインタレーターである結果オブジェクトを返します。 |
データベースへの接続
次の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 = 127.0.0.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;
}
}
ここで、上記のプログラムをコンパイルして実行し、データベース testdb に接続します。データベースは既にスキーマで利用可能であり、ユーザー_postgres_とパスワード_pass123_を使用してアクセスできます。
データベース設定に基づいて、ユーザーIDとパスワードを使用できます。 -lpqxxと-lpqを指定された順序で保持することを忘れないでください! そうしないと、リンカは、「PQ」で始まる名前の欠落している関数について苦情を訴えます。
$g++ test.cpp -lpqxx -lpq
$./a.out
Opened database successfully: testdb
テーブルを作成する
次の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 = 127.0.0.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
INSERT操作
次の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 = 127.0.0.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
SELECT操作
次の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 = 127.0.0.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 = "SELECT * from COMPANY";
/*Create a non-transactional object.*/
nontransaction N(C);
/*Execute SQL query*/
result R( N.exec( sql ));
/*List down all the records*/
for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
cout << "ID = " << c[0].as<int>() << endl;
cout << "Name = " << c[1].as<string>() << endl;
cout << "Age = " << c[2].as<int>() << endl;
cout << "Address = " << c[3].as<string>() << endl;
cout << "Salary = " << c[4].as<float>() << endl;
}
cout << "Operation done successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
上記のプログラムがコンパイルされて実行されると、次の結果が生成されます-
Opened database successfully: testdb
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 20000
ID = 2
Name = Allen
Age = 25
Address = Texas
Salary = 15000
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
Operation done successfully
更新操作
次のCコードセグメントは、UPDATEステートメントを使用してレコードを更新し、更新されたレコードを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 = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/*Create a transactional object.*/
work W(C);
/*Create SQL UPDATE statement*/
sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1";
/*Execute SQL query*/
W.exec( sql );
W.commit();
cout << "Records updated successfully" << endl;
/*Create SQL SELECT statement*/
sql = "SELECT * from COMPANY";
/*Create a non-transactional object.*/
nontransaction N(C);
/*Execute SQL query*/
result R( N.exec( sql ));
/*List down all the records*/
for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
cout << "ID = " << c[0].as<int>() << endl;
cout << "Name = " << c[1].as<string>() << endl;
cout << "Age = " << c[2].as<int>() << endl;
cout << "Address = " << c[3].as<string>() << endl;
cout << "Salary = " << c[4].as<float>() << endl;
}
cout << "Operation done successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
上記のプログラムがコンパイルされて実行されると、次の結果が生成されます-
Opened database successfully: testdb
Records updated successfully
ID = 2
Name = Allen
Age = 25
Address = Texas
Salary = 15000
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 25000
Operation done successfully
削除操作
次のCコードセグメントは、DELETEステートメントを使用してレコードを削除し、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 = 127.0.0.1 port = 5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
/*Create a transactional object.*/
work W(C);
/*Create SQL DELETE statement*/
sql = "DELETE from COMPANY where ID = 2";
/*Execute SQL query*/
W.exec( sql );
W.commit();
cout << "Records deleted successfully" << endl;
/*Create SQL SELECT statement*/
sql = "SELECT * from COMPANY";
/*Create a non-transactional object.*/
nontransaction N(C);
/*Execute SQL query*/
result R( N.exec( sql ));
/*List down all the records*/
for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
cout << "ID = " << c[0].as<int>() << endl;
cout << "Name = " << c[1].as<string>() << endl;
cout << "Age = " << c[2].as<int>() << endl;
cout << "Address = " << c[3].as<string>() << endl;
cout << "Salary = " << c[4].as<float>() << endl;
}
cout << "Operation done successfully" << endl;
C.disconnect ();
} catch (const std::exception &e) {
cerr << e.what() << std::endl;
return 1;
}
return 0;
}
上記のプログラムがコンパイルされて実行されると、次の結果が生成されます-
Opened database successfully: testdb
Records deleted successfully
ID = 3
Name = Teddy
Age = 23
Address = Norway
Salary = 20000
ID = 4
Name = Mark
Age = 25
Address = Rich-Mond
Salary = 65000
ID = 1
Name = Paul
Age = 32
Address = California
Salary = 25000
Operation done successfully