C から libpq を使って PostgreSQL に接続するプログラムの作成方法について説明します。
環境は CentOS 7 または 8、PostgreSQL 9.6 以降を対象とし、PostgreSQL に接続できる状態になっていることを前提とします。PostgreSQL のインストールや設定がまだであれば、インストール方法は こちらの記事、ローカルホスト以外からの接続受けつけに必要な設定方法は こちらの記事 を参照してください。
- 
GCC、PostgreSQL ヘッダファイル・開発ライブラリをインストールします。
CentOS 7 で PostgreSQL 11 以降の場合には、EPEL、SCL リポジトリをインストールします。理由は こちらの記事 を参照してください。
CentOS 7 の場合$ sudo yum install -y epel-release centos-release-scl (省略) Complete!続いて、GCC、PostgreSQL ヘッダファイル・開発ライブラリをインストールします。
$ sudo yum install -y gcc postgresql13-devel (省略) Complete!パッケージ名に含まれる
13は PostgreSQL のバージョンです。ご自身の環境に合わせて書き替えてください。バージョン 9.6 以前は96のように 2 つの数字からなるバージョンから.を取り除いたものとなります。 - 
プログラムを作成します。
プログラムの内容はデータベースの一覧を出力するというものです。エラー処理は原因特定に必要最低限のことしか行っていません。
test_libpq.c#include <stdio.h> #include <stdlib.h> #include <libpq-fe.h> int main(void) { const char *conninfo; PGconn *conn; PGresult *res; int i; conninfo = "host=localhost port=5432 dbname=postgres user=postgres password=password"; conn = PQconnectdb(conninfo); if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "%s", PQerrorMessage(conn)); exit(1); } res = PQexec(conn, "SELECT datname FROM pg_database"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "%s", PQerrorMessage(conn)); exit(1); } for (i = 0; i < PQntuples(res); i++) { printf("%s\n", PQgetvalue(res, i, 0)); } PQclear(res); PQfinish(conn); return 0; }変数
conninfoには空白区切りでパラメータ名=値形式で接続先を指定します。パラメータのhostは接続先のホスト、portはポート、dbnameはデータベース名、userはユーザ、passwordはパスワードを表します。ご自身の環境に合わせて書き替えてください。 - 
プログラムをビルドします。
$ gcc -Wall -I/usr/pgsql-13/include -L/usr/pgsql-13/lib -lpq -o test_libpq test_libpq.c-I、-Lオプションにはそれぞれ PostgreSQL ヘッダファイル、開発ライブラリ格納先のパスを指定します。パスに含まれる13は PostgreSQL のバージョンです。ご自身の環境に合わせて書き替えてください。エラーメッセージが出力されず、実行ファイル
test_libpqが生成されれば、プログラムのビルドは成功です。 - 
プログラムを実行します。
$ ./test_libpq postgres template1 template0エラーメッセージが出力されず、データベースの一覧が出力されれば、プログラムの実行は成功です。
 
以上でプログラムの作成は完了です。