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
エラーメッセージが出力されず、データベースの一覧が出力されれば、プログラムの実行は成功です。
以上でプログラムの作成は完了です。