避免 Heroku 部署覆蓋資料!Django 連結 PostgreSQL 教學

BY PJ. -2025 年 4 月 14 日
(最後更新於: 2025 年 5 月 10 日)


一、前言

在 Django 預設的設定中,資料庫通常使用 SQLite,
這種方式在本地開發時相當便利,也可以直接部署到 Heroku。
然而,SQLite 具有一些限制,最明顯的問題是 資料遺失風險

舉例來說,假設你的 Django 網站已經成功部署到 Heroku,並且有許多用戶註冊或訂單資料儲存在 SQLite 資料庫中。
如果你在本地端修改網站程式碼,然後重新部署到 Heroku,
SQLite 資料庫會被新的版本覆蓋,導致 Heroku 上原有的資料全部遺失。

為了解決這個問題,一個可靠的方法是 使用 Heroku 提供的 PostgreSQL 服務
透過將 Django 連結到 Heroku Postgres 資料庫,本地端和 Heroku 部署的網站都能共享同一個資料庫。

例如,當 Heroku 網頁有新訂單時,本地端 (localhost) 也能同步獲取這筆資料。
這樣一來,即使重新部署網站,也不會影響資料庫中的內容,確保數據安全與一致性。

接下來,本文將詳細介紹如何在 Heroku 部署 Django 網站時,正確連結到 PostgreSQL 資料庫,
並確保本地端與 Heroku 共享同一個資料庫,避免資料遺失的問題。


二、操作步驟

如何在 Heroku 部署 Django 網站並連結到 PostgreSQL

步驟一:安裝必要套件

首先,確保你的開發環境已經安裝以下套件:

pip install django-heroku psycopg2-binary gunicor django-enviro
  • django-heroku:自動設定 Heroku 上的 Django 環境
  • psycopg2-binary:Django 連接 PostgreSQL 需要的驅動程式
  • gunicorn:Heroku 推薦的 WSGI 伺服器,用於運行 Django 應用

終端機移動到 manage.py 同層資料夾,更新 requirements.txt

pip freeze > requirements.txt

步驟二:調整 Django 設定

(1) 修改 settings.py

settings.py 中,將資料庫設為 PostgreSQL,並加入 django-heroku 設定:

import dj_database_url, environ
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))  # 確保從正確的路徑讀取 .env

# 設定 DATABASES
DATABASES = {
    'default': dj_database_url.config(
        default=env('DATABASE_URL'),   # 直接從環境變數讀取
        conn_max_age=600,              # 設定最大連線存活時間
        ssl_require=True               # 在 Heroku 必須啟用 SSL
    )
}

步驟三:初始化 Git 儲存庫

Heroku 需要使用 Git 來部署專案,因此請先確保你的專案已經是 Git 儲存庫:

git add .
git commit -m "Initial commit"

步驟四:建立 Heroku 應用並部署

  1. 終端機移動到 manage.py 同層資料夾,執行:
heroku login
heroku addons:create heroku-postgresql
heroku config

以上 heroku config 取得的 DATABASE_URL,後續會使用。

  1. manage.py 同層資料夾建立 .env,內容為:
DATABASE_URL=(heroku config 取得的 DATABASE_URL,如 postgres://.....)
  1. 建立 .gitignore,內容為:
.env

避免 Heroku 部署覆蓋資料!Django 連結 Pos


步驟五:部署到 Heroku

將程式碼推送到 Heroku:

git push heroku main  # 若使用 master 分支,請改為 git push heroku master

heroku run python manage.py migrate

步驟六:測試與確認部署成功

最後,開啟 Heroku 應用程式,確認是否成功運作:

heroku open

若網站運作正常,即代表 Django 已經成功部署至 Heroku 並連接到 PostgreSQL!


三、結論

透過以上步驟,我們成功將 Django 網站部署到 Heroku,並將資料庫切換為 Heroku PostgreSQL,
解決了 SQLite 資料遺失的問題。這樣無論本地或 Heroku,都能共用同一個資料庫,確保數據一致性。

#python #heroku # postgresql #django

💬 留言區