PostgreSQLメモ（Windows）

# 目次
|No|概要|
|---|---|
|1|[環境変数の設定](#環境変数の設定)
|2|[PostgreSQLのサービス状態の確認・停止・起動・再起動](#postgresqlのサービス状態の確認停止起動再起動)
|3|[バッチでSQLを実行](#バッチでsqlを実行)
|4|[テーブルデータのインポートとエクスポート](#テーブルデータのインポートとエクスポート)|

※今後追加するかも

# 環境変数の設定
PostgreSQLの実行環境を環境変数に設定することで任意の場所でPostgreSQLを操作できるようになります。
### 手動で設定する場合
Windowsロゴキーをクリックして「__env__」と入力して、「__システム環境変数の編集__」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/c8e75369-5393-2836-abd8-90e7aed4e64c.png)
「__環境変数(N)...__」を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/4d094368-2b2c-4225-78f9-03a86dbd3636.png)
「__編集(I)...__」を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/42a58e8f-5cad-2f3f-e661-0abec2999590.png)
「__新規(N)__」を押下し、PostgreSQLの実行環境のパス(__"任意のインストール先"\PostgreSQL\15\bin__)を入力し、「__OK__」を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/350b7b00-ee37-84f9-794d-86f67088c10f.png)
「__OK__」を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/064cc812-e16a-ab12-3c65-97d13087663e.png)
任意の場所で「__コマンドプロンプト__」や「__PowerShell__」を起動し、以下のコマンドを実行してPostgreSQLが使用できるか確認してください。
```:PostgreSQLのバージョン確認コマンド
psql --version
```
以下のように表示されれば成功です。
```:実行結果
C:\>psql --version
psql (PostgreSQL) 15.0
```
### コマンドで指定する場合
キーボードから「__Windowsロゴキー + R__」を押下し、以下のように「__cmd__」と入力し、「__shift + ctrl + enter__」を押下して、コマンドプロンプトを管理者権限で起動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/cc85d8cb-d4f0-d918-e146-a40dfd0c9ea3.png)
その後、以下のように入力すれば環境変数を設定できます。
```:PostgreSQLの実行環境を環境変数に設定するコマンド
setx /m path "%path%;C:\Program Files\PostgreSQL\15\bin"
```
任意の場所で「__コマンドプロンプト__」や「__PowerShell__」を起動し、以下のコマンドを実行してPostgreSQLが使用できるか確認してください。
```:PostgreSQLのバージョン確認コマンド
psql --version
```
以下のように表示されれば成功です。
```:実行結果
C:\>psql --version
psql (PostgreSQL) 15.0
```
### バッチファイルに設定したり、一時的に指定できるようにする場合
バッチファイルで設定したり、環境変数を保存したくない場合は以下のコマンドで一時的に指定できるようになります。
```:一時的に環境変数を指定するコマンド
set path=%path%;"C:\Program Files\PostgreSQL\15\bin"
```
# PostgreSQLのサービス状態の確認・停止・起動・再起動
PostgreSQLのサービス自体の起動や停止方法のコマンドについて記載します。
管理者権限でのみ実行できますので以下のように管理者権限で起動してください。（環境変数の設定と同じです）
キーボードから「__Windowsロゴキー + R__」を押下し、以下のように「__cmd__」と入力し、「__shift + ctrl + enter__」を押下して、コマンドプロンプトを管理者権限で起動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/cc85d8cb-d4f0-d918-e146-a40dfd0c9ea3.png)
### PostgreSQLのサービス状態の確認
```:PostgreSQLのサービス状態の確認コマンド
pg_ctl.exe status -D "C:\Program Files\PostgreSQL\15\data"
```
以下のように表示されれば成功です。
```:実行結果
C:\WINDOWS\system32>pg_ctl.exe status -D "C:\Program Files\PostgreSQL\15\data"
pg_ctl: サーバーが動作中です(PID: 6452)
C:/Program Files/PostgreSQL/15/bin/postgres.exe "-D" "C:\Program Files\PostgreSQL\15\data"
```
### PostgreSQLのサービスの停止
サービスの停止は以下のコマンドで行えます。
```:PostgreSQLのサービスの停止コマンド
pg_ctl.exe stop -D "C:\Program Files\PostgreSQL\15\data"
```
以下のように表示されれば成功です。
```:実行結果
C:\WINDOWS\system32>pg_ctl.exe stop -D "C:\Program Files\PostgreSQL\15\data"
サーバー停止処理の完了を待っています....完了
サーバーは停止しました
```
ちなみにサービス確認のコマンドを実行すると以下のように表示されます。
```:PostgreSQLのサービス状態の確認コマンド
C:\WINDOWS\system32>pg_ctl.exe status -D "C:\Program Files\PostgreSQL\15\data"
pg_ctl: サーバーが動作していません
```
以下のように「__-m__」の後にオプションを指定して実行することもできます。
「__smart__」を指定した場合は、「__すべてのクライアントが切断するのを待ってからデータベースを停止__」します。
```:smartを指定した場合
pg_ctl.exe stop -m smart -D "C:\Program Files\PostgreSQL\15\data"
```
「__fast__」を指定した場合は、「__実行中のトランザクションをすべてロールバック＋クライアント接続を強制的切断し、停止__」します。
```:fastを指定した場合
pg_ctl.exe stop -m fast -D "C:\Program Files\PostgreSQL\15\data"
```
「__immediate__」を指定した場合は、「__サーバプロセスを即座に停止（DB再起動時にリカバリ処理が実行）__」します。
```:immediateを指定した場合
pg_ctl.exe stop -m immediate -D "C:\Program Files\PostgreSQL\15\data"
```
以下の方法でも停止できます。
```:netコマンドを使用したPostgreSQLのサービスの停止コマンド
net status postgresql-x64-XX
```
XXは任意のPostgreSQLのバージョンを指定してください。
```:PostgreSQLのバージョン15を指定した場合
net stop postgresql-x64-15
```
以下のように表示されれば成功です。
```:実行結果
C:\WINDOWS\system32>net stop postgresql-x64-15
postgresql-x64-15 - PostgreSQL Server 15 サービスを停止中です.
postgresql-x64-15 - PostgreSQL Server 15 サービスは正常に停止されました。
```
### PostgreSQLのサービスの起動
サービスの起動は以下のコマンドで行えます。
```:PostgreSQLのサービスの起動コマンド
pg_ctl.exe start -D "C:\Program Files\PostgreSQL\15\data"
```
以下のように表示されれば成功です。
```:実行結果
C:\WINDOWS\system32>pg_ctl.exe start -D "C:\Program Files\PostgreSQL\15\data"
サーバーの起動完了を待っています....2023-02-19 23:33:52.681 JST [10064] LOG:  redirecting log output to logging collector process
2023-02-19 23:33:52.681 JST [10064] HINT:  Future log output will appear in directory "log".
完了
サーバー起動完了
```
ちなみにサービス確認のコマンドを実行すると以下のように表示されます。
```:PostgreSQLのサービス状態の確認コマンド
C:\WINDOWS\system32>pg_ctl.exe status -D "C:\Program Files\PostgreSQL\15\data"
pg_ctl: サーバーが動作中です(PID: 10064)
C:/Program Files/PostgreSQL/15/bin/postgres.exe "-D" "C:/Program Files/PostgreSQL/15/data"
```
以下の方法でも起動できます。
```:netコマンドを使用したPostgreSQLのサービスの起動コマンド
net start postgresql-x64-XX
```
XXは任意のPostgreSQLのバージョンを指定してください。
```:PostgreSQLのバージョン15を指定した場合
net start postgresql-x64-15
```
以下のように表示されれば成功です。
```:実行結果
C:\WINDOWS\system32>net start postgresql-x64-15
postgresql-x64-15 - PostgreSQL Server 15 サービスを開始します..
postgresql-x64-15 - PostgreSQL Server 15 サービスは正常に開始されました。
```
### PostgreSQLのサービスの再起動
サービスの起動は以下のコマンドで行えます。
```:PostgreSQLのサービスの再起動コマンド
pg_ctl.exe reload -D "C:\Program Files\PostgreSQL\15\data"
```
以下のように表示されれば成功です。
```:実行結果
C:\WINDOWS\system32>pg_ctl.exe reload -D "C:\Program Files\PostgreSQL\15\data"
サーバーにシグナルを送信しました
```
ちなみにサービス確認のコマンドを実行すると以下のように表示されます。
```:PostgreSQLのサービス状態の確認コマンド
C:\WINDOWS\system32>pg_ctl.exe status -D "C:\Program Files\PostgreSQL\15\data"
pg_ctl: サーバーが動作中です(PID: 9840)
C:/Program Files/PostgreSQL/15/bin/postgres.exe "-D" "C:\Program Files\PostgreSQL\15\data"
```

# バッチでSQLを実行
バッチでSQLを実行する方法です。

以下のようなユーザとDBとテーブルを作成する「__init.sql__」を「__init_db.bat__」で実行することを想定します。
どちらのファイルも同じ階層にある想定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/adbaec35-6ef3-0274-26ff-1605cfb63745.png)

```:init.sql
-- DB作成
create database test;

-- 接続先dbをtestに変更
\c test

-- エンコード変更
set client_encoding to 'utf8';
-- エンコードを確認
select current_setting('client_encoding');

-- ユーザ作成
create user testuser login password 'testuser' createdb;

begin;
create schema if not exists test_schema; 
create table if not exists test_schema.user_infomation( 
    id varchar (5) not null
    , name varchar (10) not null
    , gender numeric (1) not null
    , hometown varchar (50)
    , primary key (id)
); 
comment on table test_schema.user_infomation is 'ユーザー情報テーブル'; 
comment on column test_schema.user_infomation.id is 'id'; 
comment on column test_schema.user_infomation.name is '名前'; 
comment on column test_schema.user_infomation.gender is '性別'; 
comment on column test_schema.user_infomation.hometown is '出身地';
commit;

-- スキーマ所持者変更
alter schema test_schema owner to testuser;

-- 権限付与
grant postgres to testuser;
```
・DBへの接続方法は「__psql -h "任意のホスト名" -p "任意のポート番号" -U "任意のユーザ名"__」です。
・「__-f "任意のファイル名"__」でファイルに記載したSQLを実行できます。
「__set PGPASSWORD="任意のパスワード"__」でパスワードを指定できます。
```:init_db.bat
@echo off
rem 環境変数の設定
set path=%path%;C:\Program Files\PostgreSQL\15\bin

rem ホスト名
set HOST=localhost

rem ポート番号
set PORT=5432

rem ユーザ名
set USER=postgres

rem パスワード
set PGPASSWORD=password

psql -h %HOST% -p %PORT% -U %USER% -f ./init.sql

pause
```
以下のように表示されれば実行は成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/50d550cf-4889-b425-95ef-784db43f4bb2.png)

以下のようなバッチを作成して、上記の結果確認します。
「__-d "任意のデータベース"__」は接続先のデータベースを指定できます。
「__-c "実行したいコマンド__」は接続先のデータベースを指定できます。
```:check_db.bat
@echo off
rem 環境変数の設定
set path=%path%;C:\Program Files\PostgreSQL\15\bin

rem ホスト名
set HOST=localhost

rem ポート番号
set PORT=5432

rem ユーザ名
set USER=postgres

rem ユーザ名
set DB=test

rem パスワード名
set PGPASSWORD=password

psql -h %HOST% -p %PORT% -U %USER% -d %DB% -c "\dt test_schema.*"

pause
```
以下のように表示されれば先ほど実行したバッチ(__init_db.bat__)の実行は成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/9c5de461-d2fe-ad2b-3d09-91ad56950930.png)

# テーブルデータのインポートとエクスポート
CSV形式のデータをテーブルにインポート(テーブルにデータを投入)したり、テーブルのデータcsv形式で出力する方法についてです。
### インポート
「__user_infomation__」テーブルに下記のようなCSVのデータを投入することを想定します。
```:user_infomation.csv
id,name,gender,hometown
1,太郎,1,東京
2,花子,2,大阪
```
インポートのコマンドは次のように実行します。
「__copy "任意のテーブル名" from '出力先CSVファイル名絶対パス' delimiter ',' csv header;__」
```:インポートのコマンド
copy user_infomation from 'c:/db/import/csv/user_infomation.csv' delimiter ',' csv header;
```
以下のようにデータが投入されていたら成功です。(※A5SQLで確認しています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/423a3b37-98d1-a6eb-84f1-d2fc6051c5b4.png)

### エクスポート
「__user_infomation__」テーブルのデータをCSVに出力することを想定します。
エクスポートのコマンドは次のように実行します。
「__copy "任意のテーブル名" to '読込先CSVファイル名絶対パス' delimiter ',' csv header;__」
```:エクスポートのコマンド
copy test_schema.user_infomation to 'c:/db/export/csv/user_infomation.csv' delimiter ',' csv header;
```
以下のようなCSVが出力されたら成功です。
```:user_infomation.csv
id,name,gender,hometown
1,太郎,1,東京
2,花子,2,大阪
```

※今後追加するかも
# 参考
https://qiita.com/dkurata38/items/142dbbfd416b86577e5c