[PostgreSQL][Python]VSCにおけるWSL2でのPostgreSQL環境構築

## はじめに
 OSやライブラリに影響されず、バージョン切り替えが容易な練習用DB環境を作成したく、VSCにおけるWSL2でのPostgreSQL環境構築に挑んだが、GPTや参考サイトなどを頼りにしても苦戦したため、どう対応したかログを残す。

## 想定環境
・OS：Windows 11
・Linux：Ubuntu 24.04
・Docker環境：参考資料[6]をもとに構築済み

## 実行手順
### ①パッケージのインストール
　WSL2上で、パッケージをインストールする。

```bash
sudo apt update
sudo apt install -y wget ca-certificates curl gnupg lsb-release
```

### ②Docker Engine のインストールと準備
 WSL2上でDockerエンジンのインストール

```bash
# GPG鍵を登録（上書き確認で y）
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# リポジトリ追加（Ubuntu 24.04 "noble"）
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  noble stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# パッケージ更新＆インストール
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

```

### ③systemd を有効化
　WSL2上で、有効化していく。

```bash
sudo vi /etc/wsl.conf
```
　すでに以下の設定ができている場合は、編集不要。
```
[boot]
systemd=true
```

　Windows PowerShellで WSL を再起動する。

```PowerShell
wsl --shutdown
```

### ④Docker サービスを起動
　WSL2上で、Dockerを起動する。

```bash
sudo systemctl start docker
```

### ⑤PostgreSQL用 docker-compose.yml を作成
　WSL2上で、ymlを作成する。

```bash
mkdir ~/pg-docker
cd ~/pg-docker
vi docker-compose.yml
```
　ymlは、以下を設定する。

 ```docker-compose.yml
version: "3.8"

services:
  db:
    image: postgres:17(←希望するPostgresqlのバージョが17のとき)
    container_name: my-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres（←必要に応じて変更する）
      POSTGRES_PASSWORD: 自分で設定するパスワード
      POSTGRES_DB: 自分で設定したDB名
    ports:
      - "未使用のホストポート:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

 ```

### ⑥起動確認
　WSL2上で起動して、確認する。

```bash
cd ~/pg-docker
docker compose up -d
```

　状態を確認する。

```bash
docker ps
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/26ef2d28-f2dc-40f7-9357-067d4b1928d2.png)

### ⑦Dockerを停止
　WSL2上で停止させる。

```bash
docker compose down
```

## Conda仮想環境での稼働確認
### ①仮想環境構築
```
conda create -n dbtest python=3.12.8
```

### ②仮想環境の立ち上げ
```
conda activate dbtest
```

### ③確認用Pythonファイルを作成
``` test.py
import psycopg2

conn = psycopg2.connect(
    host="localhost",
    port=設定したホストポート番号,
    dbname="設定したDB名",
    user="設定したユーザ",
    password="設定したパスワード"
)

cur = conn.cursor()
cur.execute("SELECT version();")
print(cur.fetchone())
cur.close()
conn.close()

```

### ④確認用プログラムの実行
```
python 作成したプログラムの格納場所/test.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/f3be2d11-7551-430a-86d3-1a1a3b36ecc6.png)

## 次回起動時の流れ
```bash
# WSLを起動したら以下の手順
sudo systemctl start docker
cd ~/pg-docker
docker compose up -d

# 停止する際
docker compose down
```

## DBを追加対応
 上記で作成した以外のDBを追加したい場合、docker-compose.ymlに内容を追加して起動させる。

 ``` docker-compose.yml
version: "3.8"

services:
 db:
   image: postgres:17(←希望するPostgresqlのバージョが17のとき)
   container_name: my-postgres
   restart: unless-stopped
   environment:
     POSTGRES_USER: postgres（←必要に応じて変更する）
     POSTGRES_PASSWORD: 自分で設定するパスワード
     POSTGRES_DB: 自分で設定したDB名
   ports:
     - "未使用のホストポート:5432"
   volumes:
     - postgres_data:/var/lib/postgresql/data
 db2:
    image: postgres:17
    container_name: my-postgres2(←別の名前に変更)
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres（←必要に応じて変更する）
      POSTGRES_PASSWORD: 自分で設定するパスワード
      POSTGRES_DB: 自分で設定したDB名
    ports:
      - "未使用のホストポート:5432"
    volumes:
      - postgres_data_2:/var/lib/postgresql/data

volumes:
 postgres_data:
 postgres_data_2:（←volumes追加）
 ```

## 参考資料
[1]The PostgreSQL Global Development Group, 『PostgreSQL: The world's most advanced open source database』, https://www.postgresql.org/
[2]藤那花多, 『PostgreSQLの練習環境をDockerで作り、WSL2からアクセスする』, https://zenn.dev/fjnkt98/articles/b79eaf86b83b41
[3]katsujitakeda(Katsuji Takeda), 『WSL2-Ubuntu22.04でPostgresql環境構築』,https://qiita.com/katsujitakeda/items/0c29b1dbd8445a3d70ab
[4]Microsoft, 『WSL を使用してデータベースを追加または接続する』,https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-database
[5]Microsoft, 『systemd を使用して WSL で Linux サービスを管理する』,https://learn.microsoft.com/ja-jp/windows/wsl/systemd
 [6]haveAbook(Wakana Arimoto), 『WSL2でDocker環境構築(Docker Desktop有料化対策)』,https://qiita.com/haveAbook/items/0d0ae20a19214f65e7cd