gorm使用小結


  • db.Create(user)
  • db.Save(user)

參數只能用**結構體指針****,因為要根據指針寫入該條插入的數據,
所以user可以作為該條數據使用。
新增只能用結構體

save方法在沒有主鍵的時候是新增,有主鍵的時候是更新,save可以解決空字段問題。
可以使用 db.NewRecord()判斷,該方法只檢查 結構體對應數據表 的主鍵是否為空,不查表。

  • db.Delete(&User{})

  • db.Modle(&User{}).Update()
  • db.Modle(&User{}).Updates()

1.Modle可以傳入&user, 得到的是 已修改 字段的struct,其他字段是默認字段,
2.map類型只能更新到外層(里層指針類型的字段會被置為空),嵌套的struct要解析到struct上去更新。

  1. update更新單列,Update("name","wl")或者當Updates用。
  2. updates可以傳入map/struct。
    struct只更新非零值的字段。
    map的key可以是struct的key,也可以是數據表列名。
    map的value要對應struct的類型,比如map[string]interface{}{"updated_at": time.Now()},不能使用字符串。

  • db.First(&user)
  • db.Last(&user)
  • db.Take(&user)
  • db.Find(&users) users := make([]User, 0)
  • db.Scan()
    結果放入另一個struct
  • db.Pluck("name", &names) names := make([]stirng, 0)
    單個字段的slice
  1. 查詢條件可以在Where中增加,也可以內聯,First(&user, "id=?", 1)

其他

gorm的增刪改查是 鏈式方法,每次返回*gorm.DB,即可任意拼接。

  • db.Table("users") 或者 db.Modle(&User{}) 指定表名
  • db.Where("name=?", name)

示例

  1. 查詢結果為一個數字時要用struct來接收
    type Amount struct { Total float64 }
    amount := Amount{}
    db.Select("SUM(price) AS total").Scan(&amount)

  2. 更新設置NULL
    struct是指針類型,Update("deleted_at", nil)
    否則 Update("name", gorm.Expr("NULL))
    Updates(map[string]interface{}{"name": gorm.Expr("NULL")})

  3. 類型
    gorm: bool, time必須是對應的類型,mysql則可以是0, 1 和字符串。
    gorm 類型對不上則會使用對應struct的零值。

  4. 時區
    創建記錄時:
    必須要是time類型,會根據時區來確定插入的數據時間。

go時間 go時區 數據庫存儲時間 數據庫顯示時間
2019-12-01 08:00:00 +8:00 2019-12-01 00:00:00 UTC 2019-12-01 08:00:00
2019-12-01 08:00:00 +0:00 2019-12-01 08:00:00 UTC 2019-12-01 16:00:00

查詢時:
1.可以用Where("updated_at < ?", "2019-12-01");
2.時區不影響查詢,只將時間部分作為本地時間進行查詢。

TODO

關聯表,select, join


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM