---
# System prepended metadata

title: 用 Docker 建立 PG Container 連結到本地的 Django
tags: [demo-project, django]

---

# 用 Docker 建立 PG Container 連結到本地的 Django
## 前提條件
1. docker
2. dbeaver
3. 一個用django開啟的檔案

## 步驟
### 用 docker 跑 postgres	
`docker run --name container-name -e POSTGRES_PASSWORD=mypassword -e POSTGRES_USER=myuser -e 'POSTGRES_DB=mydatabase' -p 5432:5432 -d postgres:latest`

重點記得環境變數，因為他們會影響到django跟dbeaver設定。
環境變數：
1. POSTGRES_PASSWORD (必填)  
2. POSTGRES_USER （預設 postgres）
3. POSTGRES_DATABASE (預設 跟POSTGRES_USER 一樣) 

#### optional
本地與container同步資料：
`-v ./Desktop/storage:/var/lib/postgresql/data`


### Django 連結到 Docker 的 PG
套件下載：
windows: `poetry add psycopg2`
mac: `poetry add psycopg2-binary`


在`settings.py`檔中找到資料庫的設定：
```python=
# 這是預設的sqlite設定
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}
```

把它改成以下：
> <something> 皆為自己設定的內容
```python=
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '<POSTGRES_DB>',
        'USER': '<POSTGRES_USER>',
        'PASSWORD': '<POSTGRES_USER>',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
```

記得另外再利用 dotenv ，把資料存在 .env，例如：
settings.py:
```python=
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.getenv("POSTGRES_DB"), 
        'USER': os.getenv("POSTGRES_USER"),
        'PASSWORD': os.getenv("POSTGRES_PASSWORD"),
        'HOST': os.getenv("POSTGRES_HOST"), 
        'PORT': os.getenv("POSTGRES_PORT"),
    }
}
```
.env:
```python=
POSTGRES_DB = mydatabase
POSTGRES_USER = myuser
POSTGRES_PASSWORD = mypassword
POSTGRES_HOST = localhost
POSTGRES_PORT = 5432
```

### Dbeaver 連結到 docker 裡的 pg
#### 連結
點擊最左上角的按鈕：
![Screenshot 2024-08-26 at 5.59.22 PM](https://hackmd.io/_uploads/S1JzM0YiR.png)

選擇 pg 並按 next: 
![Screenshot 2024-08-26 at 6.00.32 PM](https://hackmd.io/_uploads/B1LLM0FjA.png)

設定：
![Screenshot 2024-08-26 at 5.58.48 PM](https://hackmd.io/_uploads/r1CkzAFsR.png)

Database 輸入 POSTGRES_DB
Username 輸入 POSTGRES_USER
Password 輸入 POSTGRES_PASSWORD

#### 看 table
table 藏在這裡
![Screenshot 2024-08-26 at 6.03.14 PM](https://hackmd.io/_uploads/Bkix7AtjA.png)

這時候可以從 django makemigraions 然後 migrate 試試看有沒有成功。有成功的話應該會長出一堆table。

## 對照表

| postgresql | django | dbeaver |
| -------- | -------- | -------- |
| POSTGRES_PASSWORD   | PASSWORD     | Password     |
| POSTGRES_USER   | USER     | Username     |
| POSTGRES_DB   | NAME     | Database    |



