鍍金池/ 問答/GO  數(shù)據(jù)庫/ Gorm配合MySQL使用,db.Save 不能插入數(shù)據(jù)到數(shù)據(jù)庫

Gorm配合MySQL使用,db.Save 不能插入數(shù)據(jù)到數(shù)據(jù)庫

Gorm配合MySQL使用,db.Save 不能插入數(shù)據(jù)到數(shù)據(jù)庫

相關(guān)代碼

type Like struct {
    ID        int    `gorm:"primary_key"`
    Ip        string `gorm:"type:varchar(20);not null;index:ip_idx"`
    Ua        string `gorm:"type:varchar(256);not null;"`
    Title     string `gorm:"type:varchar(128);not null;index:title_idx"`
    CreatedAt time.Time
}

func CreateUa(c *gin.Context) {
    var like Like
    like = Like{Ip:c.PostForm("ip"),Ua:c.PostForm("ua"),Title:c.PostForm("title")}
    //db.Create(&like)
    db.Save(&like)
    c.JSON(http.StatusCreated, gin.H{
        "status": http.StatusCreated,
        "message": "Like record created successfully!",
        "LikeId": like.ID})
}

數(shù)據(jù)庫連接

var(
db *gorm.DB
err error
sqlConnection = "username:password.@(127.0.0.1:3309)/gotest?charset=utf8&parseTime=True&loc=Local"
)
db,err = gorm.Open("mysql",sqlConnection)
if err != nil{
    panic("failed to connect database")
}
defer db.Close()

執(zhí)行POST操作

http://localhost:8080/v1/createua?ip="192.168.0.8"&ua="UU888"&title="This is 8th record"

執(zhí)行POST請求,數(shù)據(jù)庫中只有ID和CreateAt字段的值,其他三個字段的數(shù)據(jù)沒有插入到數(shù)據(jù)庫

回答
編輯回答
怪痞

不知道你的db是怎么設(shè)置的,打印一下執(zhí)行的sql語句.

看你的數(shù)據(jù)庫設(shè)置應(yīng)該是沒有問題的。因為我在使用gorm的時候是開啟了數(shù)據(jù)庫連接池,因此我沒有在一個地方專門對db進(jìn)行close。我不知道你代碼里面db的生命周期是怎么樣的。建議你在調(diào)試環(huán)境中使用db = db.Debug(),可以打印要執(zhí)行的sql語句。此外,還可以在你的代碼中通過err := db.Save(&like).Error, 檢出err查看你程序的執(zhí)行是否有問題.

======補充================

package database

var db *gorm.DB

func init() {
    var dbSrc = "username:password.@(127.0.0.1:3309)/gotest?charset=utf8&parseTime=True&loc=Local"
    newDb, err := gorm.Open("mysql", dbSrc)
    if err != nil {
        panic(err)
    }

    db = newDb

    sqlDb := db.DB()
    sqlDb.SetMaxOpenConns(100)
    sqlDb.SetMaxIdleConns(15)

    if gin.IsDebugging() {
        db = db.Debug()
    }
}

func DB() *gorm.DB {
    return db.New()
}

一般情況下我會將數(shù)據(jù)庫的初始化工作放到一個init中,然后在包含main函數(shù)的文件中導(dǎo)入這個包(package),這里就舉個例子:

import _ "database"

這樣在程序啟動的時候, 就會會自動初始化db(而且不用擔(dān)心會初始化多次)。然后在需要使用的地方只需要調(diào)用

db := database.DB()

這樣可以拿到一個db對象。

2018年9月15日 17:37
編輯回答
維他命

我覺得答案都錯了,Save是有Create的作用的,就是當(dāng)ID不存在的時候,會調(diào)用Create
樓主問題是出在參數(shù)傳過去沒接收到,他也說了:
“執(zhí)行POST請求,數(shù)據(jù)庫中只有ID和CreateAt字段的值,其他三個字段的數(shù)據(jù)沒有插入到數(shù)據(jù)庫”
說明是插入成功的
所以問題在這里:
http://localhost:8080/v1/createua?ip="192.168.0.8"&ua="UU888"&title="This is 8th record"
這是get請求啊,樓主用post去接收,肯定獲取不到值啊

2017年11月14日 07:45
編輯回答
尋仙
db.First(&user)

user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)

//// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;

摘自:http://doc.gorm.io/crud.html#...

注意,Save是更新全部字段,但是對于數(shù)據(jù)庫來說總得知道哪條數(shù)據(jù)要更新吧(id來指定),看你的場景應(yīng)該是想要用Create,而不是Save

2018年2月4日 10:59