gorp 更新不更新

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


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

这有效


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)

   }

}


撒科打诨
浏览 196回答 2
2回答

绝地无双

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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go