首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gorp更新不更新

gorp更新不更新
EN

Stack Overflow用户
提问于 2015-06-08 08:03:37
回答 1查看 895关注 0票数 12

我在用gorp更新postgresql数据库中的一行时遇到问题,Im可以使用db.Exec成功地运行更新,所有列都使用正确的信息进行更新,而gorp只能更新非sql.Null*字段,而其余的字段保持不变。

代码语言:javascript
复制
var db *sql.DB
var dbmap *gorp.DbMap

func 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 = ssid
npr.Lat = dbProbes[index].Lat
npr.Lon = dbProbes[index].Lon
npr.Sec = dbProbes[index].Sec
npr.Bssid = dbProbes[index].Bssid
npr.Channel = dbProbes[index].Channel
npr.Found = dbProbes[index].Found
npr.Datefirst = dbProbes[index].Datefirst
npr.Datelast = dbProbes[index].Datelast
npr.Found = true

这行得通

代码语言:javascript
复制
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))

这不是

代码语言:javascript
复制
func updateNetwork(n *WirelessNetwork) {
    _, dbmap := getDB()
    _, err := dbmap.Update(n)
   if err != nil {
        log.Fatal("updateNetwork - ", err)
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-13 10:32:41

sql.Null*类型是带有Valid布尔字段的结构,该字段指示值是否为NULL。布尔值的初始值为false,因此除非显式验证数据,否则将向数据库发送NULL。你没有告诉我们,什么是dbProbes,它是如何得到数据的,但是如果它是用类似的东西初始化的

代码语言:javascript
复制
dbProbes[index].Lat = sql.NullFloat64{Float64: lat}

那么Valid仍然是假的,您需要手动验证您的数据:

代码语言:javascript
复制
dbProbes[index].Lat = sql.NullFloat64{Float64: lat, Valid: true}

或者使用Scan方法:

代码语言:javascript
复制
err = dbProbes[index].Lat.Scan(lat)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30703965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档