Gorm配合MySQL使用,db.Save 不能插入数据到数据库

Gorm配合MySQL使用,db.Save 不能插入数据到数据库

相关代码

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})
}

数据库连接

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()

执行POST操作

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

执行POST请求,数据库中只有ID和CreateAt字段的值,其他三个字段的数据没有插入到数据库

阅读 10.8k
3 个回答
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是更新全部字段,但是对于数据库来说总得知道哪条数据要更新吧(id来指定),看你的场景应该是想要用Create,而不是Save

不知道你的db是怎么设置的,打印一下执行的sql语句.

看你的数据库设置应该是没有问题的。因为我在使用gorm的时候是开启了数据库连接池,因此我没有在一个地方专门对db进行close。我不知道你代码里面db的生命周期是怎么样的。建议你在调试环境中使用db = db.Debug(),可以打印要执行的sql语句。此外,还可以在你的代码中通过err := db.Save(&like).Error, 检出err查看你程序的执行是否有问题.

======补充================

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()
}

一般情况下我会将数据库的初始化工作放到一个init中,然后在包含main函数的文件中导入这个包(package),这里就举个例子:

import _ "database"

这样在程序启动的时候, 就会会自动初始化db(而且不用担心会初始化多次)。然后在需要使用的地方只需要调用

db := database.DB()

这样可以拿到一个db对象。

我觉得答案都错了,Save是有Create的作用的,就是当ID不存在的时候,会调用Create
楼主问题是出在参数传过去没接收到,他也说了:
“执行POST请求,数据库中只有ID和CreateAt字段的值,其他三个字段的数据没有插入到数据库”
说明是插入成功的
所以问题在这里:
http://localhost:8080/v1/createua?ip="192.168.0.8"&ua="UU888"&title="This is 8th record"
这是get请求啊,楼主用post去接收,肯定获取不到值啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题