iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Modern Web

Go,一起成為全端吧!—— 給前端工程師的 Golang 後端學習筆記系列 第 26

Day26 - 環境變數管理:打造可移植的專案架構

  • 分享至 

  • xImage
  •  

今天要建立 .env 檔案,讓 To-do List 專案「 安全、可移植、易維護 」,而且在不同環境時,只要切換 .env 檔案的內容即可。

所以目標是:

  1. 把資料庫的連線資訊抽出來放到 .env
  2. 安裝、使用 godotenv 讀取 .env

首先,要先在根目錄建立一個 .env 檔案,然後安裝 Go 的 joho/godotenv 套件來讀取 .env 檔案:

go get github.com/joho/godotenv

檔案建立好之後,就先把它加進 .gitignore 檔案裡,以免開發到最後忘記放進去了….千萬要記得不要把 .env 檔案上傳到 GitHub !

接下來,會修改的檔案是 main.go 的這支入口啟動程式,還有 db.go 的這支,主要就是有關於連線方面的資訊,就會被移到 .env 檔案。

那就先來寫 .env 檔案吧!

APP_PORT=8080
APP_ENV=development

# SQLite
DB_TYPE=sqlite
DB_NAME=tasks.db

# PostgreSQL(之後可以切換)
//DB_TYPE=postgres
//DB_HOST=localhost
//DB_PORT=8081
//DB_USER=account
//DB_PASSWORD=password
//DB_NAME=to_do_list

我加上了 postgres 資料庫的設定,但先把它註解掉,因為目前使用的是 SQLite ,他算是檔案型資料庫,(例如:tasks.db)不用帳號、密碼,也不需要 host、port,就可以讀取這個檔案,詳細說明可以參考 Day 17~

這邊先解釋一下 postgres 的參數:

  • DB_HOST=localhost :資料庫伺服器位置 (本地端就是 localhost)。
  • DB_PORT=8081 :PostgreSQL 預設的 port。
  • DB_USER=account :使用者帳號 (安裝 PostgrSQL 設定的)。
  • DB_PASSWORD=password :使用者密碼 (安裝 PostgrSQL 設定的)。
  • DB_NAME=to_do_list :你要連線的資料庫名稱。

透過上面的這些設定,專案會在啟動之後把這些參數拼接成一個字串:

host=localhost user=account password=password dbname=to_do_list port=8081 sslmode=disable
gorm.Open(postgres.Open("放入串好的字串"))

完成初步的 .env 檔案之後,要來修改 main.go 檔案。這邊就會用到一開始下載的套件了!
要在專案一開始的時候,讀取環境變數( .env 檔案):

package main
import (
	"log"
	"os"
	"github.com/joho/godotenv"
)

func main() {
	err := godotenv.Load()
	if err != nil {
		log.Println(".env file not found")
	}
	
	os.Getenv("APP_ENV")
	port := os.Getenv("APP_PORT")
	r.Run(":" + port)
}

接下來,我們先安裝一下 PostgreSQL 資料庫的套件:

go get gorm.io/driver/postgres

完成安裝之後才能使用 postgres.Open() 指令,以及 import "gorm.io/driver/postgres"
然後,再修改 db.go 檔案,讓資料庫連線的方式透過讀取環境變數進行:

package database
import (
	"fmt"
	"log"
	"os"
	"gorm.io/driver/sqlite"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
)

var DB *gorm.DB
func InitDB() {
	dbType := os.Getenv("DB_TYPE")
	var err error
	
	// 確認 DB 是否已初始化
	if DB != nil {
		return
	}

	switch dbType {
		case "sqlite":
			dbFile := os.Getenv("DB_NAME")
			DB, err = gorm.Open(sqlite.Open(dbFile), &gorm.Config{})
		case "postgres":
			url := fmt.Sprintf(
				"host=%s user=%s password=%s dbname=%s port=%s sslmode=disable",
				os.Getenv("DB_HOST"),
				os.Getenv("DB_USER"),
				os.Getenv("DB_PASSWORD"),
				os.Getenv("DB_NAME"),
				os.Getenv("DB_PORT"),
			)
			DB, err = gorm.Open(postgres.Open(url), &gorm.Config{})
		default:
			log.Fatal("DB_TYPE not supported")
	}

	if err != nil {
		log.Fatal("failed to connect database:", err)
	}
}

檔案都修改完後,可以啟動 server 跑跑看有沒有成功~
以上就是今天的分享啦~


上一篇
Day25 - 環境變數管理:認識 .env 檔案
系列文
Go,一起成為全端吧!—— 給前端工程師的 Golang 後端學習筆記26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言