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

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

在 Go 中增加結構值

在 Go 中增加結構值

Go
慕的地6264312 2022-07-11 16:43:35
我希望看到visits每個GET請求的增量,/foo但它仍然是1. 我在這里做錯了什么?package mainimport (    "log"    "github.com/gofiber/fiber/v2"    "gorm.io/driver/sqlite"    "gorm.io/gorm")// Item modeltype Item struct {    gorm.Model    UID    int64  `gorm:"primaryKey;autoIncrement"`    Name   string `gorm:"index;not null"`    Visits int32  `gorm:"default 0"`}func main() {    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})    if err != nil {        panic(err)    }    db.AutoMigrate(&Item{})    db.Create(&Item{        Name: "foo",    })    app := fiber.New(fiber.Config{})    app.Get("/:name", func(c *fiber.Ctx) error {        var i Item        db.First(&i, "name = ?", c.Params("name"))        if i.Name == "" {            return c.Status(fiber.StatusNotFound).JSON(&fiber.Map{                "message": "Not found",            })        }        db.Model(&i).Update("visits", i.Visits+1)        return c.JSON(i)    })    log.Println("Listening...")    log.Fatal(app.Listen(":3000"))}
查看完整描述

1 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

如果您記錄以下錯誤:


if err := db.Model(&i).Update("visits", i.Visits+1).Error; err != nil {

    fmt.Printf("update err != nil; %v\n", err)

}

你會看到它說:“需要條件”。所以,你可以像這樣解決這個問題:


if err := db.Model(&i).Where("name = ?", i.Name).Update("visits", i.Visits+1).Error; err != nil {

    fmt.Printf("update err != nil; %v\n", err)

}

這是有關GORM 中的錯誤處理的更多詳細信息


編輯:您的示例實際上存在一個更大的問題。問題是您將其定義UID為Item模型的一部分,這與提供的內容沖突gorm.Model。您可以在聲明模型中看到以下模型定義:


// gorm.Model definition

type Model struct {

  ID        uint           `gorm:"primaryKey"`

  CreatedAt time.Time

  UpdatedAt time.Time

  DeletedAt gorm.DeletedAt `gorm:"index"`

}

當添加到您的Item類型/模型中時,您將獲得:


type Item struct {

  // gorm.Model

  ID        uint           `gorm:"primaryKey"`

  CreatedAt time.Time

  UpdatedAt time.Time

  DeletedAt gorm.DeletedAt `gorm:"index"`

  // your fields

  UID    int64  `gorm:"primaryKey;autoIncrement"`

  Name   string `gorm:"index;not null"`

  Visits int32  `gorm:"default 0"`

}

似乎這會導致您的數據庫表以奇怪的狀態創建。您可能會在返回的 JSON 有效負載中注意到IDANDUID都等于 0。當您多次啟動/停止服務器并查看創建的其他記錄(因為您db.Create()位于頂部)時,您最終會得到多個項目名稱為“foo”,所有的ID和UID都為 0...這就是為什么 GORM 在沒有 WHERE 子句的情況下無法更新項目的原因,因為主鍵沒有在表上正確設置。


如果您從模型中刪除 UID(或者甚至只是從中刪除“primaryKey”),則可以使用該Update()方法而無需 where 條件。因此,您的模型應如下所示:


// Item model

type Item struct {

    gorm.Model

    Name   string `gorm:"index;not null"`

    Visits int32  `gorm:"default 0"`

}

更改模型/類型后,請確保刪除test.db文件,以便使用新/正確格式重新創建表。


最后,關于我的原始答案,您還應該看到 GORM 自動將錯誤記錄到您的控制臺,而無需像我建議的那樣專門處理它們。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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