wls2 Ubuntu postgresql gccで遊ぶ。

※セキュリティとか権限とか何も考えていません。
 ハードコートするなよと言わないでね。
 gccとpostgresqlを使って遊ぶだけです。

1.必要なものをインストール

>sudo apt update && sudo apt upgrade

>sudo apt install build-essential

>sudo apt install postgresql postgresql-contrib  libpq-dev

2.Postgresql起動

# PostgreSQL の状態を確認する
>sudo service postgresql status

12/main (port 5432): down   #止まってるね。

# PostgreSQL を開始する
>sudo service postgresql start

* Starting PostgreSQL 12 database server                                                                        [ OK ]

# PostgreSQL の状態を確認する
>sudo service postgresql status

12/main (port 5432): online

3.postgreユーザになってしまう。

>  sudo -i -u postgres

4.psqlでDB作成 
       demo1というDB作成

> psql 
postgres=# create database demo1;
CREATE DATABASE

5.できたか確認

postgres=# select * from pg_database;
  oid  |  datname  | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace |               datacl
-------+-----------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-------------------------------------
13427 | postgres  |     10 |        6 | C.UTF-8    | C.UTF-8  | f             | t            |           -1 |         13426 |          479 |          1 |          1663 |
    1 | template1 |     10 |        6 | C.UTF-8    | C.UTF-8  | t             | t            |           -1 |         13426 |          479 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
13426 | template0 |     10 |        6 | C.UTF-8    | C.UTF-8  | t             | f            |           -1 |         13426 |          479 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
16385 | demo1     |     10 |        6 | C.UTF-8    | C.UTF-8  | f             | t            |           -1 |         13426 |          479 |          1 |          1663 |
(4 rows)

6.demo1にテーブル作成

CREATE TABLE weather (
   city            varchar(80),
   temp_lo         int,           -- 最低気温
   temp_hi         int,           -- 最高気温
   prcp            real,          -- 降水量
   date            date
);

7.データ挿入

INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');

8.データ確認

demo1=# select * from weather;
    city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

9.接続テストユーザ作成

demo1=# CREATE ROLE user01 LOGIN PASSWORD 'user01';
CREATE ROLE
demo1=#
demo1=# GRANT SELECT, UPDATE, INSERT ON weather TO user01;
GRANT

10.postgresユーザで入ってpsql動かして抜ける。

$ sudo -i -u postgres
postgres@MC0153A:~$ psql demo1
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
Type "help" for help.

demo1=# \q
postgres@MC0153A:~$ exit
logout

11.Cソースを書く。

/*
*
*
* testprog1.c
*/

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
       PQfinish(conn);
       exit(1);
}

int
main(int argc, char **argv)
{
const char *conninfo;
PGconn     *conn;
PGresult   *res;
int         nFields;
int         i,
           j;

       conninfo = "host=localhost port=5432 dbname=demo1 user=user01 password=user01";

       /* データベースとの接続を確立する */
       conn = PQconnectdb(conninfo);

       /* バックエンドとの接続確立に成功したかを確認する */
       if (PQstatus(conn) != CONNECTION_OK)
       {
               fprintf(stderr, "Connection to database failed: %s",
               PQerrorMessage(conn));
               exit_nicely(conn);
       }

       /*
       *
       *      検索
       *
       */
       res = PQexec(conn, "select * from weather");
       if (PQresultStatus(res) != PGRES_TUPLES_OK)
       {
               fprintf(stderr, "SQL failed: %s", PQerrorMessage(conn));
               PQclear(res);
               exit_nicely(conn);
       }


       /* まず属性名を表示する。 */
       nFields = PQnfields(res);
       for (i = 0; i < nFields; i++)
               printf("%-15s", PQfname(res, i));
       printf("\n\n");


       /* そして行を表示する。 */
       for (i = 0; i < PQntuples(res); i++)
       {
               for (j = 0; j < nFields; j++)
                       printf("%-15s", PQgetvalue(res, i, j));
               printf("\n");
       }

       PQclear(res);


       /* ポータルを閉ざす。ここではエラーチェックは省略した… */
       res = PQexec(conn, "CLOSE myportal");
       PQclear(res);
       /* データベースとの接続を閉じ、後始末を行う。 */
       PQfinish(conn);
       return 0;
}

12.コンパイル

 gcc -c -I/usr/include/postgresql testprog1.c
 gcc -o testprog1  testprog1.o -lpq

13.実行してみる

$ ./testprog1
city           temp_lo        temp_hi        prcp           date

San Francisco  46             50             0.25           1994-11-27

データが表示された。
めでたし。めでたし。

ちゃんと「DECLARE 」使ったほうがいいかな?





サポートして頂くと頑張るかもしれません。