libpqでC言語からPostgreSQLのDBに接続する。
接続には、PQconnectdbを使う。
https://www.postgresql.jp/document/8.4/html/libpq-connect.html
postgreSQL
まず、インストール。
[bg1@localhost ~]$ su パスワード: [root@localhost bg1]# yum install postgresql-devel Fedora Modular 31 - x86_64 11 kB/s | 6.4 kB 00:00 Fedora Modular 31 - x86_64 - Updates 16 kB/s | 5.4 kB 00:00 Fedora 31 - x86_64 - Updates 9.7 kB/s | 5.5 kB 00:00 Fedora 31 - x86_64 - Updates 541 kB/s | 2.6 MB 00:04 Fedora 31 - x86_64 11 kB/s | 6.5 kB 00:00 依存関係が解決しました。 ================================================================================ Package Architecture Version Repository Size ================================================================================ インストール: libpq-devel x86_64 12.2-1.fc31 updates 98 k トランザクションの概要 ================================================================================ インストール 1 パッケージ ダウンロードサイズの合計: 98 k インストール済みのサイズ: 336 k これでよろしいですか? [y/N]: y パッケージのダウンロード: libpq-devel-12.2-1.fc31.x86_64.rpm 136 kB/s | 98 kB 00:00 -------------------------------------------------------------------------------- 合計 62 kB/s | 98 kB 00:01 トランザクションの確認を実行中 トランザクションの確認に成功しました。 トランザクションのテストを実行中 トランザクションのテストに成功しました。 トランザクションを実行中 準備 : 1/1 インストール中 : libpq-devel-12.2-1.fc31.x86_64 1/1 scriptletの実行中: libpq-devel-12.2-1.fc31.x86_64 1/1 検証 : libpq-devel-12.2-1.fc31.x86_64 1/1 インストール済み: libpq-devel-12.2-1.fc31.x86_64 完了しました! [root@localhost bg1]#
意外とlibpq-develが入ってなかった。
PQconnectdbの接続だけ。
ソースコードはこれでいいんだけど、今の状態だと、Ident認証なので、bg1からtestuser1の持つtestuser1dbにアクセスできない。
(testuser1dbに接続できるのはtestuser1ロールであり、Linuxユーザのtestuser1でログインしていないといけない。)
そこで、
[root@localhost PQconnectdb]# cd /var/lib/pgsql/data/ [root@localhost data]# vi pg_hba.conf
pg_hba.confを開いて、
修正前は、identとある部分を、
passwordに変更する。
(md5にするとか、USERとかDATABSEとかいろいろいじったけど、セキュリティはともかく、この方法でしか上手くいかなかった。)
あと、Linuxユーザのtestuser1にパスワードをセットしていたけど、PostgreSQLのロールのtesuser1にはパスワード設定していなかった気がするので、psqlで、
postgres=# ALTER USER testuser1 WITH PASSWORD <パスワード>;
これもやっておかないとたぶん接続できないのでは。
[root@localhost data]# psql -U testuser1 -h localhost -d testuser1db psql: FATAL: ユーザ"testuser1"のIdent認証に失敗しました [root@localhost data]# cd /var/lib/pgsql/data/ [root@localhost data]# vi pg_hba.conf [root@localhost data]# service postgresql restart Redirecting to /bin/systemctl restart postgresql.service [root@localhost data]# psql -U testuser1 -h localhost -d testuser1db ユーザ testuser1 のパスワード: psql (11.7) "help" でヘルプを表示します。 testuser1db=> exit [root@localhost data]#
このように、rootからtestuser1でのtestuser1db接続は出来ないはずだが、
先程のpg_hba.conf編集の後は、接続できる。
bg1ユーザで、C言語プログラムからも接続できるはず。
[bg1@localhost PQconnectdb]$ vi main.c [bg1@localhost PQconnectdb]$ gcc main.c -o main -lpq [bg1@localhost PQconnectdb]$ ./main OK [bg1@localhost PQconnectdb]$
接続できた。
いろいろ調べたけど、結構ハマった・・・。
ちゃんとアクセス制限はしないといけないけど、今回はとりあえずこれで・・・。
Sample/libpq/PQconnectdb/PQconnectdb/src/PQconnectdb at master · bg1bgst333/Sample · GitHub