0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C から libpq を使って PostgreSQL に接続してみる

Last updated at Posted at 2021-08-14

C から libpq を使って PostgreSQL に接続するプログラムの作成方法について説明します。

環境は CentOS 7 または 8、PostgreSQL 9.6 以降を対象とし、PostgreSQL に接続できる状態になっていることを前提とします。PostgreSQL のインストールや設定がまだであれば、インストール方法は こちらの記事、ローカルホスト以外からの接続受けつけに必要な設定方法は こちらの記事 を参照してください。

  1. 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 つの数字からなるバージョンから . を取り除いたものとなります。

  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 はパスワードを表します。ご自身の環境に合わせて書き替えてください。

  3. プログラムをビルドします。

    $ 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 が生成されれば、プログラムのビルドは成功です。

  4. プログラムを実行します。

    $ ./test_libpq
    postgres
    template1
    template0
    

    エラーメッセージが出力されず、データベースの一覧が出力されれば、プログラムの実行は成功です。

以上でプログラムの作成は完了です。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?