Ubuntu 18.04  + VsCode + Python3 + psycopg2(libpq-dev) から Posgtgres12 にアクセスしてみる

# 目的
・Ubuntu 18.04(その１)に Posgtgres12 をインストールする
・新規roleを作成する
・新規DB(demo)を作成する
・作成済のroleに対して新規作成DB(demo)に対する権限を付与する
・作成したテーブルに対して Ubuntu 18.04(その２) + VsCode + Python3 + psycopg2 からアクセスしてみる
※Ubuntu 18.04 に psycopg2 のインストするのが意外とめんどくさかったのでメモを残しておく
※libpq-devは昔からめんどくさかった気がする・・・
※psycopg2をビルドする場合は、リポジトを設定後 libpq-dev のみインストールすれば良い
※パッケージ関連で迷った時の apt search はやはり重要 なぜ pip にはないんだろう？？

## Code RunnerでPython3をキックする場合の修正点
修正になったバージョンが不明なのだけど 1.46.1 の時点では以下の手順で修正する
・ファイル -> 基本設定 -> 設定
・検索ボックスに Code-runner:Executor Map を入力する
<pre>
・setting.json で編集をクリックする
 ・修正前
    "code-runner.executorMap": {
    }
 ・修正後
    "code-runner.executorMap": {
        "python": "python3 -u"
    }
</pre>

## インストールの準備
・必要なパッケージをインストールする

<pre>
$ sudo apt-get install curl ca-certificates gnupg
</pre>
・鍵を入れる

<pre>
$ sudo curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
</pre>
・リポジトリの参照リストに追記する。
aptのリポジトリを順にみていくとv13まであるようだ
※http://apt.postgresql.org/pub/repos/apt/dists/focal-pgdg/13/

<pre>
$ sudo apt-add-repository 'deb http://apt.postgresql.org/pub/repos/apt bionic-pgdg main'
</pre>
/etc/apt/sources.list (の最後の行)に 

<pre>
deb http://apt.postgresql.org/pub/repos/apt bionic-pgdg main
&#35; deb-src http://apt.postgresql.org/pub/repos/apt bionic-pgdg main
</pre>
が追加されるが、以下の様に [arch=amd64] を追加する

<pre>
deb [arch=amd64] http://apt.postgresql.org/pub/repos/apt bionic-pgdg main
&#35; deb-src [arch=amd64] http://apt.postgresql.org/pub/repos/apt bionic-pgdg main
</pre>

## psycopg2のインストール
psycopg2をビルドする場合は、リポジトを設定後 libpq-dev のみインストールすれば良い
<pre>
$ sudo apt search postgres | grep libpq
--> libpq-dev/bionic-pgdg,now 12.3-1.pgdg18.04+1 amd64
$ sudo apt install libpq-dev
$ sudo pip3 install psycopg2
Collecting psycopg2
  Downloading ～
Building wheels for collected packages: psycopg2
  Running setup.py bdist_wheel for psycopg2 ... done
  Stored in directory: ～
Successfully built
</pre>

## リポジトリを更新後にPostgresをインストールする
※postgresql-13 のレポジトリは今日現在では使用不可のようだ
<pre>
$ sudo apt update
$ sudo apt install postgresql-12 pgadmin4
</pre>
## 設定ファイルの修正
<pre>
/etc/postgresql/12/main/postgresql.conf の修正
&#35;コメントアウト
&#35;listen_addresses = 'localhost' # what IP address(es) to listen on;

&#35;以下に修正
listen_addresses = '*'           # what IP address(es) to listen on;
</pre>

<pre>
/etc/postgresql/12/main/pg_hba.conf を以下に修正
&#35; "local" is for Unix domain socket connections only
&#35;local   all             all                                     peer
local   all             all                                       md5
&#35; IPv4 local connections:
&#35;host    all             all             127.0.0.1/32            md5
host    all             all             192.168.5.0/24            md5
&#35; IPv6 local connections:
&#35;host    all             all             ::1/128                 md5
&#35; Allow replication connections from localhost, by a user with the
&#35;replication privilege.
&#35;local   replication     all                                     peer
&#35;host    replication     all             127.0.0.1/32            md5
&#35;host    replication     all             ::1/128                 md5
</pre>
上記２ファイルを修正後pgsqlを再起動する

<pre>
$ sudo pg_ctlcluster 12 main restart
</pre>

## アクセス環境の設定
<pre>
$ su - postgres
$ psql -U postgres
ユーザ postgres のパスワード:
psql (12.3 (Ubuntu 12.3-1.pgdg20.04+1))
"help"でヘルプを表示します。

postgres=#  alter role postgres password 'passwd';
ALTER ROLE
postgres=# create role demo with login password 'demo';
CREATE ROLE
postgres=# create database demo;
CREATE DATABASE
postgres=# grant all on database demo to demo;
GRANT

$ psql -U demo
ユーザ demo のパスワード:
psql (12.3 (Ubuntu 12.3-1.pgdg20.04+1))
"help"でヘルプを表示します。

demo=> \c demo
データベース"demo"にユーザ"demo"として接続しました。

※テーブル作成後は以下の様に表示される
demo=> \d
            リレーション一覧
 スキーマ |  名前   |    型    | 所有者
----------+---------+----------+--------
 public   | zipcode | テーブル | demo
(1 行)
</pre>

## 対象テーブルに書き込むコード
[Ubuntu 20.04 に Posgtgres をインストール後 C# + Npgsql でアクセスしてみる](https://qiita.com/tabizou/items/47f395d7ab3030dd1915)
と同じ

## サンプルコード
Ubuntu 18.04にpsycopg2をインストール後動作を確認
以下は Ubuntu 18.04  + VsCode で作成＆動作確認

```cs
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
# coding:utf-8

import psycopg2

server   = '192.168.5.49' 
port= '5432'
database = 'demo' 
username = 'demo' 
password = 'passwd'
count = 0
# 接続文字列 - 空白文字がセパレータなのか？？
constr = 'host=' + server + ' port=' + port + ' dbname=' + database + ' user=' + username + ' password=' + password
conn = psycopg2.connect(constr)

cur = conn.cursor()

# 挿入したデータの件数を確認する
cur.execute("SELECT COUNT(*) FROM ZIPCODE")
row = cur.fetchone()

if row:
    print(row)

cur.close()
conn.close()

```

# 参考にしたサイトはこちら
[NOT NULL制約(カラムにNULLの格納を許可するかどうか)](https://www.dbonline.jp/postgresql/table/index4.html)
[第8章 データ型](https://www.postgresql.jp/document/12/html/datatype.html)
[PythonからPostgreSQLに接続する方法](https://www.ashisuto.co.jp/db_blog/article/20160308_postgresql_with_python.html)
[psycopg2 - Python-PostgreSQL Database Adapter](https://pypi.org/project/psycopg2/)
[必要ライブラリがありません事案の救世主apt-file](https://qiita.com/hash/items/c145b09807b1188b0374)
[Ubuntu 20.04 に Posgtgres をインストール後 C# + Npgsql でアクセスしてみる](https://qiita.com/tabizou/items/47f395d7ab3030dd1915)
[Win10 + VsCode + Python3 + psycopg2 から Ubuntu 20.04 + Posgtgres12 にアクセスしてみる](https://qiita.com/tabizou/items/ff2255ec546e2d3e6e2e)