加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – gorp更新不更新

发布时间:2020-12-12 16:56:01 所属栏目:MsSql教程 来源:网络整理
导读:使用gorp在我的 postgresql数据库中更新一行时,我可以成功地使用db.Exec运行更新,所有列都使用正确的信息进行更新,而gorp im只能更新非sql.Null *字段,而休息保持不变. var db *sql.DBvar dbmap *gorp.DbMapfunc getDB() (*sql.DB,*gorp.DbMap) { if db == ni
使用gorp在我的 postgresql数据库中更新一行时,我可以成功地使用db.Exec运行更新,所有列都使用正确的信息进行更新,而gorp im只能更新非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)
   }
}

解决方法

sql.Null *类型是具有有效布尔字段的结构,它指示该值是否为NULL. boolean的初始值为false,因此除非您明确验证数据,否则将向数据库发送NULL.你没有告诉我们,什么是dbProbes,它是如何获取数据的,但是如果它是初始化的
dbProbes[index].Lat = sql.NullFloat64{Float64: lat}

那么有效仍然为false,您需要手动验证数据:

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

或使用扫描方法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读