# 用 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 |