【WSL2,CSV】WSL2上のCSVをDB(postgres)にインサートする

#はじめに
『[オープンソースデータベース標準教科書 -PostgreSQL-（Ver.2.0.0）Kindle版](https://www.amazon.co.jp/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A8%99%E6%BA%96%E6%95%99%E7%A7%91%E6%9B%B8-PostgreSQL-%E5%AE%AE%E5%8E%9F%E5%BE%B9-ebook/dp/B00BW2KFSW/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9&qid=1617198796&sr=8-1)』で
「郵便番号のCSVファイルを格納するデータベースを設計し、そこにデータを格納する」という演習があったので、実行したい。
（教科書の章＝4.演習　--4.2演習2:郵便番号データベース）

https://qiita.com/ume-san/items/cd914a40820a3a5f22db

の続き。

#今回やること
［WSL2(Ubuntu)にインポートした郵便番号CSVファイル］をDBにインサートしたい。
そのために・・・

①　郵便番号データを格納するための表をDBに作成
②　psqlから\copyメタコマンドで①の表にCSVファイルをインサート

以上2点を実行する。

# 環境
|||バージョン|
|:--|:--|:--|
|Host OS|Windows 10 Home|21H1(OSビルド:19043.1165)|
|Virtual Machine(仮想環境技術)|WSL2|-|
|Remote OS(仮想環境OS)|Ubuntu| 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)|
|Database|PostgreSQL|12.7 (Ubuntu 12.7-0ubuntu0.20.04.1)|
|Database GUI|無し|-|
|Docker|無し|-|
|エディタ|Visual Studio Code|1.60.0|

#①　郵便番号データ(CSV)を格納するための表をDBに作成

◆前提条件◆
VSCでpostgresサービスに接続し、psqlシェルに入っている状態。
（今回の場合はユーザー名「postgres」でpsqlに入ったので、コマンドラインが「postgres=#」で始まっている状態。）

-----

◆表作成◆
CREATE TABLEで「zip」という名前のテーブル（表）を作る。

```:VSC_TERMINAL(PostgreSQL-SQL)
#CREATE TABLE zip 
(lgcode char(5), oldzip char(5), newzip char(7), 
prefkana text, citykana text, areakana text, pref text, 
city text, area text, largearea integer, koaza integer, 
choume integer, smallarea integer, change integer, reason integer);
```
実行画面。↓　入力したコマンドの次行に「CREATE TABLE」と表示された。
![100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/b4fe21fc-720c-6ce3-1173-6cc98ee0c373.png)
表、できた！！

-----

◆気になったのでメモ（データ型）◆
（自分メモ：[以前の記事](https://qiita.com/ume-san/items/f10686fd76f2e1c50121#%E8%A9%A6%E8%A1%8C%E9%8C%AF%E8%AA%A4%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E4%BD%9C%E6%88%90--csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89insert%E6%96%87%E7%94%9F%E6%88%90--dbeaver%E3%81%AB%E8%B2%BC%E4%BB%98%E3%81%91) をコピペ&修正 ↓）

上記CREATE文中で定義しているデータ型は「char(n), text, integer」の3種類。

|データ型|意味|
|:--|:--|
|char(n)|空白で埋められた固定長のデータ型。またの表記をcharacter(n)。|
|text|制限無し可変長のデータ型。|
|integer|4バイト符号付き整数のデータ型。|

↓　text型についてメモ　↓
>PostgreSQLは、いかなる長さの文字列でも格納できるtextをサポートします。 text型は標準SQLにはありませんが、多くの他のSQLデータベース管理システムも同様にサポートしています。
（引用元：[PostgreSQL 9.3.2文書 第8章データ型 8.3.文字型](https://www.postgresql.jp/document/9.3/html/datatype-character.html)）

-----

◆気になったのでメモ（表の確認）◆

本当に表作成できたのか、確認したくなったので

```:VSC_TERMINAL(PostgreSQL)
#\d zip;
（\d テーブル名　＝　テーブル構造の表示）
（;　を忘れずに！）
```

で確認。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/20869950-15c1-2fca-937d-4cfc1ebe3867.png)
OK！できてた！

#②　psqlから\copyメタコマンドで①の表にCSVファイルをインサート
標準教科書に

>psql から\copy メタコマンドでロードします。
ossdb=# \copy zip from KEN_ALL_UTF8.CSV with csv
（引用元：『オープンソースデータベース標準教科書 -PostgreSQL-（Ver.2.0.0）』4.2.3 データのロードと文字コードについて）

とあったので、自分の状況に合わせてコマンドを替えて、実行する。

```:VSC_TERMINAL(PostgreSQL-コマンド)
#\copy zip from database/KEN_ALL.CSV with csv
（copy ロード先のテーブル名 from 絶対パス/ロードするファイル名 with csv）
（copy from = ファイルをテーブルに読み込むコマンド）
（FROM句には、DBサーバ内の絶対パスで対象ファイルを指定する）
```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/12c7923e-88d4-5045-9c10-c01da9102a0b.png)

「COPY ＜CSVファイルの桁数＞」が表示された。
インサート完了！

↓

```:VSC_TERMINAL(PostgreSQL-SQL)
#select * from zip;
（SELECT文。「zip」テーブルから全データを取得。）
```
でインサートできているか確認。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/47d7f865-7d54-b114-acb7-17e4eee4297c.png)
OK！できてた！

#メモ
◆catコマンドとdコマンドの違いは？どちらも情報を閲覧しているように思える。
cat＝ファイルの閲覧。
d＝テーブル(表)に含まれるカラムに関する情報を取得。
今回のケースだと、
catはテーブル作成の前に、「CSVファイルを閲覧」するために使用した。
dはテーブル作成の後に、「テーブルの構造を表示」するために使用した。
 　
◆コマンドは「\」で始める。SQLは「;」で終わる。
「；」について　↓
>1行の最後にセミコロン（；）があれば，そこまでをSQL文とみなして処理します（セミコロンの後ろの空白及び制御文字は無視されます）。セミコロンがない場合は，その行は次の行に継続しているものとして扱われます。
（引用元：[継続行の扱い](http://itdoc.hitachi.co.jp/manuals/3020/3020635543/W3550136.HTM)）

◆言葉

||意味|
|:--|:--|
|アップロード|ファイルをサーバー等に置いてくること。PCとサーバーのファイルのやり取り。|
|インポート|アプリケーション内にデータを取り込むこと。アプリケーション間のデータの移行に使う。|
|インサート|「データをデータベースにインサート」のように使う。SQLのinsert文使うときとか。|
|ロード|読み込むこと。何をどこに読み込むかはケース・バイ・ケース。|
（参考：[アップロード・インポート](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13127718938)、[ロード](https://wa3.i-3-i.info/word13080.html)）

#参考
・「[PostgreSQLの基本的なコマンド](https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb)」@H-A-L さんQiita記事

#次やる事
・DBeaverからUbuntu(WSL2)への接続
（pg_hbaの設定が効いていない可能性を疑ってみる。設定前に戻して、エラー文言が変わらなければ設定が間違ってたり、効いていない可能性を疑う。）
・「KEN_ALL.CSV」のデータをDBeaverで参照