gorp更新不更新
gorp Update not updating
我在使用 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=,lat=,lon=,sec=,channel=,found=,datefirst=,datelast=,bssid= WHERE id=",
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)
}
}
sql.Null*
类型是具有 Valid
布尔字段的结构,它指示值是否为 NULL。布尔值的初始值为 false,因此除非您显式验证数据,否则您将向数据库发送 NULL。你没有告诉我们什么是 dbProbes
以及它是如何获取数据的,但是如果它是用
之类的东西初始化的
dbProbes[index].Lat = sql.NullFloat64{Float64: lat}
那么 Valid
仍然是错误的,您需要手动验证您的数据:
dbProbes[index].Lat = sql.NullFloat64{Float64: lat, Valid: true}
或使用Scan
方法:
err = dbProbes[index].Lat.Scan(lat)
我在使用 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=,lat=,lon=,sec=,channel=,found=,datefirst=,datelast=,bssid= WHERE id=",
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)
}
}
sql.Null*
类型是具有 Valid
布尔字段的结构,它指示值是否为 NULL。布尔值的初始值为 false,因此除非您显式验证数据,否则您将向数据库发送 NULL。你没有告诉我们什么是 dbProbes
以及它是如何获取数据的,但是如果它是用
dbProbes[index].Lat = sql.NullFloat64{Float64: lat}
那么 Valid
仍然是错误的,您需要手动验证您的数据:
dbProbes[index].Lat = sql.NullFloat64{Float64: lat, Valid: true}
或使用Scan
方法:
err = dbProbes[index].Lat.Scan(lat)