为了账号安全,请及时绑定邮箱和手机立即绑定

gorp 更新不更新

gorp 更新不更新

Go
撒科打诨 2021-10-11 18:42:11
我在用 gorp 更新我的 postgresql 数据库中的一行时遇到问题,我成功地使用 db.Exec 运行更新,所有列都用正确的信息更新,而 gorp 我只能更新非 sql.Null* 字段,而其余保持不变。var db *sql.DBvar dbmap *gorp.DbMapfunc getDB() (*sql.DB, *gorp.DbMap) {    if db == nil {        var err error        db, err = sql.Open("postgres", "postgres://xxxxxxxx")        db.SetMaxOpenConns(5)        db.SetMaxIdleConns(0)        dbmap = &gorp.DbMap{Db: db, Dialect: gorp.PostgresDialect{}}        dbmap.AddTableWithName(WirelessNetwork{}, "network").SetKeys(true, "Id")        if err != nil {            log.Panic(err)        }    }    return db, dbmap}type WirelessNetwork struct {    Id        int             `db:"id"`    Ssid      string          `db:"ssid"`    Lat       sql.NullFloat64 `db:"lat"`    Lon       sql.NullFloat64 `db:"lon"`    Sec       sql.NullString  `db:"sec"`    Bssid     sql.NullString  `db:"bssid"`    Channel   sql.NullInt64   `db:"channel"`    Found     bool            `db:"found"`    Datefirst sql.NullString  `db:"datefirst"`    Datelast  sql.NullString  `db:"datelast"`}npr := new(WirelessNetwork)npr.Id = getNetworkId(ssid)npr.Ssid = ssidnpr.Lat = dbProbes[index].Latnpr.Lon = dbProbes[index].Lonnpr.Sec = dbProbes[index].Secnpr.Bssid = dbProbes[index].Bssidnpr.Channel = dbProbes[index].Channelnpr.Found = dbProbes[index].Foundnpr.Datefirst = dbProbes[index].Datefirstnpr.Datelast = dbProbes[index].Datelastnpr.Found = true这有效db, _ := getDB()db.Exec("UPDATE network SET ssid=$1,lat=$2,lon=$3,sec=$4,channel=$5,found=$6,datefirst=$7,datelast=$8,bssid=$9 WHERE id=$10",    npr.Ssid, npr.Lat.Float64, npr.Lon.Float64, npr.Sec.String, npr.Channel.Int64, npr.Found, npr.Datefirst.String, npr.Datelast.String, npr.Bssid.String, getNetworkId(ssid))这不func updateNetwork(n *WirelessNetwork) {    _, dbmap := getDB()    _, err := dbmap.Update(n)   if err != nil {        log.Fatal("updateNetwork - ", err)   }}
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

sql.Null*类型是具有Valid布尔字段的结构,它告诉值是否为 NULL。boolean 的初始值为 false,因此除非您明确验证数据,否则您将向数据库发送 NULL。你没有告诉我们,dbProbes它是什么以及如何获取数据,但如果它是用类似的东西初始化的

dbProbes[index].Lat = sql.NullFloat64{Float64: lat}

thenValid仍然是错误的,您需要手动验证您的数据:

dbProbes[index].Lat = sql.NullFloat64{Float64: lat, Valid: true}

或使用以下Scan方法:

err = dbProbes[index].Lat.Scan(lat)


查看完整回答
反对 回复 2021-10-11
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信