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 支援常見的資料庫關聯關係(如一對一、一對多、和多對多)。
示例:User
和 Order
的一對多關係:
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 會自動推斷模型結構體所對應的資料庫表名。預設情況下,表名是根據結構體名稱的複數形式確定的。
表名的推斷規則
-
預設規則:
- GORM 會將模型結構體名稱轉換為小寫的複數形式作為表名。例如:
User
→users
Product
→products
- GORM 會將模型結構體名稱轉換為小寫的複數形式作為表名。例如:
-
表名格式的轉換:
- GORM 會根據英文的複數規則轉換。例如:
Category
→categories
Company
→companies
- 如果不符合複數規則(如外來詞),可以手動設定表名。
- GORM 會根據英文的複數規則轉換。例如:
自定義表名
如果你不希望使用 GORM 的自動複數規則,可以手動指定表名。有兩種常見的方法:
- 在結構體上使用
TableName()
方法。 - 在 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 會直接使用結構體的名稱作為表名,而不會自動加複數。例如:
User
→user
總結
預設情況下,GORM 會將 User
結構體對映到名為 users
的表中(複數形式)。如果不想使用預設的複數規則,你可以透過實現 TableName()
方法或在配置中禁用複數表名來自定義表名。