[golang] GROM 進階範例

 

功能範例
連接 MySQLgorm.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 main
import (
    "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 User
db.First(&user, "email = ?", "alice@example.com")
log.Println("User:", user)



5. 關聯查詢(Preload & Joins)

// 預加載 Profile & Ordersvar user User
db.Preload("Profile").Preload("Orders").First(&user, 1)
log.Println("User:", user)

// JOIN 查詢var results []User
db.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      string
    Stock     int
    Version   int64`gorm:"version"`
}

// 更新時確保 Version 沒變
db.Model(&Product{}).Where("id = ? AND version = ?", 1, currentVersion).
    Updates(Product{Stock: newStock, Version: currentVersion + 1})


留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署