在上一篇文章中,介紹 GORM ORM 框架以及如何使用它創建資料庫模型和執行 Migration。今天我們瞭解一些 GORM 的其他功能,包括一對多(has many, belongs to)關係、CRUD(創建、讀取、更新、刪除)操作,以及如何將條件直接帶入 ORM 查詢。
在資料庫設計中,一對多關係是一種常見的模型。舉例來說,一個博客應用程式中,一個作者(Author)可以撰寫多篇文章(Article)。在 GORM 中,您可以使用結構體的嵌套和標籤來表示這種關係。
type Author struct {
gorm.Model
Name string
Articles []Article // 一個作者擁有多篇文章
}
type Article struct {
gorm.Model
Title string
Content string
AuthorID uint // 外鍵,指向作者的ID
}
使用 GORM,執行 CRUD(創建、讀取、更新、刪除)操作非常簡單。
newAuthor := Author{Name: "John Smith"}
db.Create(&newAuthor)
newArticle := Article{Title: "Introduction to GORM", Content: "GORM is a powerful ORM framework."}
db.Create(&newArticle)
// 通過主鍵查詢作者
var author Author
db.First(&author, 1)
// 查詢所有文章
var articles []Article
db.Find(&articles)
// 更新作者名稱
db.Model(&author).Update("Name", "John Doe")
// 更新文章內容
db.Model(&articles[0]).Updates(Article{Title: "Updated Title", Content: "Updated content"})
// 刪除作者
db.Delete(&author)
// 刪除文章
db.Delete(&articles[0])
// 帶入自定義條件查詢作者
var authors []Author
db.Where("name LIKE ?", "%John%").Find(&authors)
// 使用多個條件
db.Where("name = ? AND age > ?", "John", 30).Find(&authors)
package main
import (
"gorm.io/gorm"
"gorm.io/driver/postgres"
"log"
)
type Author struct {
gorm.Model
Name string
Articles []Article // 一個作者擁有多篇文章
}
type Article struct {
gorm.Model
Title string
Content string
AuthorID uint // 外鍵,指向作者的ID
}
func main() {
// 配置數據庫連接
dsn := "user=username dbname=mydb password=mypassword host=localhost"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("無法連接到數據庫:", err)
}
// 創建資料庫表格
err = db.AutoMigrate(&Author{}, &Article{})
if err != nil {
log.Fatal("無法執行 Migration:", err)
}
// 創建一個作者和兩篇文章
newAuthor := Author{Name: "John Smith"}
db.Create(&newAuthor)
article1 := Article{Title: "Introduction to GORM", Content: "GORM is a powerful ORM framework.", AuthorID: newAuthor.ID}
article2 := Article{Title: "Advanced GORM Techniques", Content: "Learn advanced GORM features.", AuthorID: newAuthor.ID}
db.Create(&article1)
db.Create(&article2)
// 查詢作者以及他的文章
var author Author
db.Preload("Articles").First(&author, 1)
log.Printf("作者名稱:%s", author.Name)
for _, article := range author.Articles {
log.Printf("文章標題:%s,內容:%s", article.Title, article.Content)
}
// 更新作者名稱
db.Model(&author).Update("Name", "John Doe")
// 使用條件查詢文章
var filteredArticles []Article
db.Where("title LIKE ?", "%Introduction%").Find(&filteredArticles)
for _, article := range filteredArticles {
log.Printf("過濾後的文章:%s", article.Title)
}
// 刪除文章
db.Delete(&article1)
db.Delete(&article2)
// 刪除作者
db.Delete(&author)
}
等等要吃室外辦桌,好期待呀