iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
Modern Web

Golang x Echo 30 天:零基礎GO , 後端入門系列 第 9

連線 PostgreSQL:資料庫,你的後盾!

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250923/2017881874bhebaaAx.png

連線 PostgreSQL:用 pgxpool 把「吸管桶」準備好 🧋🐘

哈囉探險家們,歡迎來到鐵人賽 Day 9!
工具(Go)與交通工具(Echo)都到位了,但遊戲要存檔、網頁要記住使用者資料,還缺一個「資料收納箱」——資料庫(Database)。今天主角有兩位:PostgreSQL(穩又強的資料庫)+ pgxpool(Go 和資料庫的溝通管家)。一起把效能與穩定度拉滿!🚀


什麼是資料庫?就是你的「資料收納箱」📦

想像衣櫃:T 恤、褲子、襪子分門別類,要找衣服一秒到位。
資料庫也一樣:把註冊帳號、文章內容、上傳照片整理好,程式想拿什麼,像超快圖書館管理員一樣「嗶一下」就找到。


為什麼用 pgxpool?你的「連線管家」🙋‍♂️

  • pgx:Go ↔ PostgreSQL 的翻譯官,讓雙方聽得懂彼此。
  • pgxpool:一桶「預先準備好的連線」,需要時直接借、用完再放回。
    就像熱門手搖店門口放一桶吸管:不用每次都重新拆一根,速度噴發、效能穩穩。

連線是什麼?📞

程式要跟資料庫說話,會先建立一條「通話線路」=連線(Connection)
一直重撥很耗時,所以我們準備一整桶——連線池(Connection Pool)


準備工作:用 Docker 叫醒 PostgreSQL 🐳

先安裝 Docker(到官網下載)。接著在終端機執行:

docker run --name my-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  -d postgres
  • --name my-postgres:幫容器取名字
  • -e POSTGRES_PASSWORD=...:設定資料庫密碼
  • -p 5432:5432:把容器的 5432 埠對外開啟(很重要!你的 Go 程式才能連到 localhost:5432
  • -d postgres:用官方映像,背景執行

小叮嚀:如果想下次重開機還在,記得用 volume 存資料;這章先專注連成功就好。📝


安裝 Go 套件:pgx & pgxpool 📦

go get github.com/jackc/pgx/v4

實作:第一個「連線管家」🧑🍳

新建 main.go,貼上:

package main
 
import (
    "context"
    "fmt"
    "log"
    "os"
 
    "github.com/jackc/pgx/v4/pgxpool"
)
 
func main() {
    // 從環境變數讀取連線字串(較安全)
    // 格式:"postgresql://使用者:密碼@主機:port/資料庫"
    connStr := os.Getenv("DATABASE_URL")
    if connStr == "" {
        // 若沒設定就使用 Docker 預設
        connStr = "postgresql://postgres:mysecretpassword@localhost:5432/postgres"
    }
 
    // Context:這次任務的「通行證」
    ctx := context.Background()
 
    // 建立連線池(吸管桶)
    pool, err := pgxpool.Connect(ctx, connStr)
    if err != nil {
        log.Fatalf("無法連線到資料庫: %v", err)
    }
    // 離開前把門關好
    defer pool.Close()
 
    fmt.Println("成功連線到 PostgreSQL!")
 
    // 試刺:問一下版本,確認通了
    var serverVersion string
    err = pool.QueryRow(ctx, "select version()").Scan(&serverVersion)
    if err != nil {
        log.Fatalf("查詢失敗: %v", err)
    }
    fmt.Printf("資料庫版本: %s\n", serverVersion)
}

重點速讀 🧠

  • DATABASE_URL 放密碼與主機資訊在環境變數更安全 🔐
  • pgxpool.Connect 建好可重複使用的連線池,少走冤枉路 ⚡
  • defer pool.Close() 禮貌收尾,釋放資源 🧹
  • QueryRow("select version()") 成功拿到版本=你打通任督二脈 ✅

小劇場:你可能遇到的狀況與解法 🧯

  • connection refused:多半是忘了 -p 5432:5432,或容器尚未啟動
  • 認證失敗:檢查密碼 POSTGRES_PASSWORD 是否一致
  • 找不到主機localhost、埠號、資料庫名稱拼對沒?
  • 密碼外洩焦慮:把連線字串放到 DATABASE_URL別寫死在程式碼

今天學到什麼?🎯

  • 資料庫是收納箱,讓資料好找又安全
  • PostgreSQL穩、強、免費,是入門到進階都靠得住的夥伴
  • pgxpool像吸管桶,省下重複拆吸管的時間,效能更穩更快

你已經把資料庫連起來了,接下來就能開始「尋寶」:新增、查詢、更新、刪除(CRUD)✨
下一篇,我們把寶箱打開,把資料存進去、撈出來。準備升級啦!🗺️🏆


彩蛋:環境變數示範(可選)🥚

macOS / Linux(暫時在當前 shell):

export DATABASE_URL="postgresql://postgres:mysecretpassword@localhost:5432/postgres"
go run main.go

Windows PowerShell:

$env:DATABASE_URL="postgresql://postgres:mysecretpassword@localhost:5432/postgres"
go run .\main.go

上一篇
請求參數驗證:資料對不對,先打個分數!
下一篇
基本 SQL 實作:從 CRUD 到交易管理
系列文
Golang x Echo 30 天:零基礎GO , 後端入門12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言