亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

gorm 中的外鍵約束

gorm 中的外鍵約束

Go
嚕嚕噠 2022-08-24 11:42:26
我想創建一個預訂-艙位關系,在這個關系中,每個預訂只能分配一個艙位。type Class struct {    Id   int    `json:"id"`    Name string `json:"name"`}type Booking struct {    Id      int    `json:"id"`    User    string `json:"user"`    Members int    `json:"members"`    ClassId int    `json:"classid"`}我知道它類似于gorm在這里解釋的“屬于”關系,https://gorm.io/docs/belongs_to.html 但我想知道是否有可能在不定義Booking模型中的Class類型字段的情況下實現“外鍵約束”(只有ClassId int)。為了確保使用不存在的 ClassId-s,我定義了函數:func Find(slice []int, val int) bool {    for _, item := range slice {        if item == val {            return true        }    }    return false}func GetClassKeys(d *gorm.DB) []int {    var keys []int    rows, _ := d.Raw(`SELECT id                        FROM classes`).Rows()    defer rows.Close()    for rows.Next() {        var key int        rows.Scan(&key)        keys = append(keys, key)    }    return keys}并在創建/更新預訂之前執行此檢查:if !Find(GetClassKeys(db), booking.ClassId) {    log.Println("Wrong class id value")    return}但這不能處理刪除類id的情況(常規數據庫會自動執行此操作)。我想知道有沒有辦法通過簡單地在用戶模型中引用Class的主鍵來實現與gorm的正常數據庫外鍵功能?提前致謝
查看完整描述

1 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

我不認為遷移器工具會幫助你,因為它假設你將使用默認的Gorm模式來定義關系,并且你已經明確決定不使用這些模式。


剩下的唯一選擇是自己管理約束,要么通過SQL腳本,要么通過更簡單的,在調用旁邊運行的一些自定義查詢:AutoMigrate


import "gorm.io/gorm/clause"


// somewhere you must be calling

db.AutoMigrate(&Class{}, &Booking{})


// then you'd have:

constraint := "fk_booking_classid"

var count int64

err := db.Raw(

    "SELECT count(*) FROM INFORMATION_SCHEMA.table_constraints WHERE constraint_schema = ? AND table_name = ? AND constraint_name = ?", 

    db.Migrator().CurrentDatabase(),

    "bookings",

    constraint,

).Scan(&count).Error

// handle error


if (count == 0) {

    err := db.Exec(

        "ALTER TABLE bookings ADD CONSTRAINT ? FOREIGN KEY class_id REFERENCES classes(id)",

        clause.Table{Name: constraint},

    ).Error

    // handle error

}

當然,這否定了自動遷移的優勢(這意味著當字段名稱等內容發生變化時,約束將在不更改遷移代碼的情況下更新)。


我會看看為什么你不想像gorm預期的那樣定義外鍵,因為這聞起來像你試圖直接使用數據庫模型作為JSON API請求/響應模型,這通常不會導致一個好的結束:)


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號