iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

在上一篇文章中,介紹 GORM ORM 框架以及如何使用它創建資料庫模型和執行 Migration。今天我們瞭解一些 GORM 的其他功能,包括一對多(has many, belongs to)關係、CRUD(創建、讀取、更新、刪除)操作,以及如何將條件直接帶入 ORM 查詢。

一對多(has many, belongs to)關係

在資料庫設計中,一對多關係是一種常見的模型。舉例來說,一個博客應用程式中,一個作者(Author)可以撰寫多篇文章(Article)。在 GORM 中,您可以使用結構體的嵌套和標籤來表示這種關係。

type Author struct {
    gorm.Model
    Name    string
    Articles []Article // 一個作者擁有多篇文章
}

type Article struct {
    gorm.Model
    Title   string
    Content string
    AuthorID uint // 外鍵,指向作者的ID
}

CRUD 操作

使用 GORM,執行 CRUD(創建、讀取、更新、刪除)操作非常簡單。

  • Creat
newAuthor := Author{Name: "John Smith"}
db.Create(&newAuthor)

newArticle := Article{Title: "Introduction to GORM", Content: "GORM is a powerful ORM framework."}
db.Create(&newArticle)
  • Read
// 通過主鍵查詢作者
var author Author
db.First(&author, 1)

// 查詢所有文章
var articles []Article
db.Find(&articles)
  • Update
// 更新作者名稱
db.Model(&author).Update("Name", "John Doe")

// 更新文章內容
db.Model(&articles[0]).Updates(Article{Title: "Updated Title", Content: "Updated content"})
  • Delete
// 刪除作者
db.Delete(&author)

// 刪除文章
db.Delete(&articles[0])

試著把條件直接帶入 ORM 查詢

  • 練習用 where 方法
// 帶入自定義條件查詢作者
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)
}

碎語

等等要吃室外辦桌,好期待呀


上一篇
20 | 救命,我不想寫SQL
下一篇
22 | 內存管理
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言