[golang] GROM 進階範例
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
| 功能 | 範例 |
|---|---|
| 連接 MySQL | gorm.Open(mysql.Open(dsn)) |
| 自動建表 | db.AutoMigrate(&User{}) |
| 插入數據 | db.Create(&user) |
| 查詢數據 | db.First(&user, id) |
| 關聯查詢 | db.Preload("Orders").Find(&user) |
| 交易 | db.Transaction(func(tx *gorm.DB) error {...}) |
| 樂觀鎖 | gorm:"version" |
ChatGPT 說:
GORM 是 Go 語言中強大的 ORM(Object-Relational Mapping)框架,用來與資料庫交互。以下是 進階使用範例,涵蓋 關聯、交易、Hook、樂觀鎖等。
1. 安裝 GORM & 驅動
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql # MySQL 驅動
go get -u gorm.io/driver/postgres # PostgreSQL 驅動
2. 連接資料庫
MySQL
package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log")funcmain() {dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatal("資料庫連接失敗:", err)}log.Println(log.Println("資料庫連接成功")
}
3. 定義 Model(含 gorm.Model、關聯、Hook)
package main
import (
"gorm.io/gorm"
"time"
)
// User 模型(含 `gorm.Model` 內建欄位)
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100;not null"`
Email string `gorm:"uniqueIndex"`
Age int `gorm:"default:18"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"` // 軟刪除
Profile Profile `gorm:"foreignKey:UserID"` // 1對1
Orders []Order `gorm:"foreignKey:UserID"` // 1對多
}
// Profile (1對1)
type Profile struct {
ID uint `gorm:"primaryKey"`
UserID uint `gorm:"uniqueIndex"`
Address string
}
// Order (1對多)
type Order struct {
ID uint `gorm:"primaryKey"`
UserID uint
Product string
Price float64
}
// Hook:建立前執行
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.CreatedAt = time.Now()
return nil
}
4. 建立 & 查詢資料
自動建立資料表
db.AutoMigrate(&User{}, &Profile{}, &Order{})
插入數據
user := User{Name: "Alice", Email: "alice@example.com"}db.Create(&user)
查詢數據
var user Userdb.First(&user, "email = ?", "alice@example.com")log.Println("User:", user)
5. 關聯查詢(Preload & Joins)
// 預加載 Profile & Ordersvar user Userdb.Preload("Profile").Preload("Orders").First(&user, 1)log.Println("User:", user)// JOIN 查詢var results []Userdb.Joins("Profile").Joins("Orders").Find(&results)log.Println("Users with Profile & Orders:", results)
6. 交易(Transaction)
err := db.Transaction(func(tx *gorm.DB)error {if err := tx.Create(&User{Name: "Bob"}).Error; err != nil {return err}if err := tx.Create(&Profile{UserID: 1, Address: "New York"}).Error; err != nil {return err}returnnil})if err != nil {log.Println("交易失敗:", err)} else {log.Println("交易成功")}
7. 樂觀鎖(Optimistic Locking)
type Product struct {ID uint`gorm:"primaryKey"`Name stringStock intVersion int64`gorm:"version"`}// 更新時確保 Version 沒變db.Model(&Product{}).Where("id = ? AND version = ?", 1, currentVersion).Updates(Product{Stock: newStock, Version: currentVersion + 1})
留言
張貼留言