GORM基本用法

Gold_stein發表於2024-10-17

GORM基本用法

詳細內容

GORM 概述

GORM 是一個適用於 Golang 的功能齊全的 ORM(物件關係對映)庫。它簡化了資料庫操作,將資料庫中的表對映為 Golang 結構體,並透過程式碼實現常見的 SQL 操作,如查詢、插入、更新和刪除等。

GORM 的特點:

  • 全功能 ORM:支援 CRUD(增刪查改)、事務、關聯關係、鉤子函式、預載入等。
  • 資料庫支援:支援 MySQL、PostgreSQL、SQLite、SQL Server 等資料庫。
  • 鏈式呼叫:提供鏈式呼叫方式編寫 SQL 查詢,程式碼簡潔清晰。
  • 遷移功能:提供資料庫自動遷移能力,可自動建立或更新表結構。

基本用法

1. 安裝 GORM

首先需要安裝 GORM 及對應的資料庫驅動程式(以 MySQL 為例):

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

2. 初始化資料庫連線

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
)

func main() {
	// 配置資料庫連線資訊
	dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

	// 初始化資料庫連線
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal("資料庫連線失敗:", err)
	}

	log.Println("資料庫連線成功!")
}

3. 定義模型(結構體)

GORM 使用結構體對映資料庫中的表。示例定義一個 User 結構體:

type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"size:100"`
	Email string `gorm:"unique"`
	Age   int
}

4. 自動遷移(Auto Migrate)

GORM 提供自動遷移功能,根據結構體生成資料庫表。

db.AutoMigrate(&User{})

這裡透過AutoMigrate生成的表,其表名是GORM根據我們的類名推匯出來的,把類名User變成複數形式Users,就得到了表名。

5. 插入資料

使用 Create 方法插入一條資料:

user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := db.Create(&user)

if result.Error != nil {
	log.Println("插入失敗:", result.Error)
} else {
	log.Printf("成功插入使用者,ID: %d", user.ID)
}

6. 查詢資料

var user User
// 查詢單條記錄
db.First(&user, 1) // 根據主鍵查詢
db.First(&user, "email = ?", "alice@example.com")

// 查詢多條記錄
var users []User
db.Where("age > ?", 20).Find(&users)

7. 更新資料

// 更新使用者的 Email
db.Model(&user).Update("Email", "newalice@example.com")

// 批次更新
db.Model(&user).Updates(User{Name: "Alice Updated", Age: 26})

8. 刪除資料

// 根據主鍵刪除
db.Delete(&user, 1)

// 根據條件刪除
db.Where("age > ?", 30).Delete(&User{})

9. 關聯關係

GORM 支援常見的資料庫關聯關係(如一對一、一對多、和多對多)。

示例:UserOrder 的一對多關係:

type Order struct {
	ID     uint
	UserID uint
	Amount float64
}

type User struct {
	ID     uint
	Name   string
	Orders []Order `gorm:"foreignKey:UserID"`
}

db.AutoMigrate(&User{}, &Order{})

10. 使用事務

err := db.Transaction(func(tx *gorm.DB) error {
	if err := tx.Create(&User{Name: "Bob"}).Error; err != nil {
		return err
	}

	if err := tx.Create(&Order{UserID: 1, Amount: 100.0}).Error; err != nil {
		return err
	}

	return nil // 返回 nil 表示提交事務
})

if err != nil {
	log.Println("事務失敗:", err)
} else {
	log.Println("事務成功")
}

總結

GORM 提供了簡單易用的 API,幫助 Golang 開發者專注於業務邏輯而非資料庫操作。透過定義結構體並使用鏈式呼叫,GORM 讓 SQL 操作更直觀,同時支援複雜的查詢、關聯關係和事務處理,適用於多種資料庫和專案場景。

表名管理

是的,GORM 會自動推斷模型結構體所對應的資料庫表名。預設情況下,表名是根據結構體名稱的複數形式確定的。


表名的推斷規則

  1. 預設規則

    • GORM 會將模型結構體名稱轉換為小寫的複數形式作為表名。例如:
      • Userusers
      • Productproducts
  2. 表名格式的轉換

    • GORM 會根據英文的複數規則轉換。例如:
      • Categorycategories
      • Companycompanies
    • 如果不符合複數規則(如外來詞),可以手動設定表名。

自定義表名

如果你不希望使用 GORM 的自動複數規則,可以手動指定表名。有兩種常見的方法:

  1. 在結構體上使用 TableName() 方法。
  2. 在 GORM 配置中禁用複數表名。

1. 使用 TableName() 方法

在模型結構體中新增 TableName() 方法,可以覆蓋 GORM 自動推斷的表名。

type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"size:100"`
	Email string `gorm:"unique"`
	Age   int
}

// 自定義表名方法
func (User) TableName() string {
	return "custom_user_table"
}

這樣,GORM 會將表名設為 "custom_user_table"


2. 禁用複數表名(全域性配置)

你還可以在 GORM 初始化時禁用自動複數表名:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
	NamingStrategy: schema.NamingStrategy{
		SingularTable: true, // 禁用複數表名
	},
})

此時,GORM 會直接使用結構體的名稱作為表名,而不會自動加複數。例如:

  • Useruser

總結

預設情況下,GORM 會將 User 結構體對映到名為 users 的表中(複數形式)。如果不想使用預設的複數規則,你可以透過實現 TableName() 方法或在配置中禁用複數表名來自定義表名。

相關文章