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

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

Go-gorm 返回所有記錄

Go-gorm 返回所有記錄

Go
ABOUTYOU 2022-08-30 15:14:48
假設我們有以下結構:type Task struct {    ...    Completed bool      `gorm:"default:false"                  json:"-"`}MySQL 數據庫中有 5 個條目:其中2個具有Completed=1其中3個具有Completed=0我面臨以下特點:db, err = gorm.Open("mysql", connstr)var ret []Task// This returns 3 rowsdb.Debug().Model(&Task{}).Find(&ret, "Completed =?", false)// This returns 2 rowsdb.Debug().Model(&Task{}).Find(&ret, Task{Completed: true})// BUT THIS RETURNS 5 ROWS!db.Debug().Model(&Task{}).Find(&ret, Task{Completed: false})任何想法為什么會發生這種情況?上次調用時執行的 SQL 為:SELECT * FROM 'tasks'我想避免為每個結構字段編寫新的SQL查詢。傳遞結構(對象)似乎更明智。
查看完整描述

1 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

原因

GORM 查看提供給 的結構的字段,并檢查是否設置了哪些字段,以構造查詢。因此,在第二個示例中,它看到設置為 ,并向查詢中添加一個 WHERE 子句:Find()Completedtrue


db.Debug().Model(&Task{}).Find(&ret, Task{Completed: true})

生成:


SELECT * FROM "tasks" WHERE "tasks"."completed" = true

在第二個例子中,GORM無法知道你是否傳入或僅僅是因為 是 一個 的零值。Task{Completed: false}Task{}falsebool


如果您有一個字段是 一個 并嘗試查詢 :int0


db.Debug().Model(&Task{}).Find(&ret, Task{Num: 0}) // Generates: SELECT * FROM 'tasks'

溶液

如果確實要將結構用于查詢,則可以更改模型,使其為 .由于指針的零值為 nil,因此提供指向 false 的指針將告訴 GORM 添加該子句:Completed*boolbool


trueBool := true

falseBool := false


db.Debug().Model(&Task{}).Find(&ret, Task{Completed: &falseBool})

db.Debug().Model(&Task{}).Find(&ret, Task{Completed: &trueBool})

生成(分別)


SELECT * FROM "tasks" WHERE "tasks"."completed" = false

SELECT * FROM "tasks" WHERE "tasks"."completed" = true

請記住,這樣做意味著可以將其保存在數據庫中,就像未設置一樣。CompletedNULL


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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