今天要建立 .env
檔案,讓 To-do List 專案「 安全、可移植、易維護 」,而且在不同環境時,只要切換 .env
檔案的內容即可。
所以目標是:
.env
。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 跑跑看有沒有成功~
以上就是今天的分享啦~