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でログインしていないといけない。)
そこで、
PostgreSQLの設定 - 初めてのVPS構築
[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