# 用 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
#### 連結
點擊最左上角的按鈕:

選擇 pg 並按 next:

設定:

Database 輸入 POSTGRES_DB
Username 輸入 POSTGRES_USER
Password 輸入 POSTGRES_PASSWORD
#### 看 table
table 藏在這裡

這時候可以從 django makemigraions 然後 migrate 試試看有沒有成功。有成功的話應該會長出一堆table。
## 對照表
| postgresql | django | dbeaver |
| -------- | -------- | -------- |
| POSTGRES_PASSWORD | PASSWORD | Password |
| POSTGRES_USER | USER | Username |
| POSTGRES_DB | NAME | Database |