我们之前开发的行人检测系统已经大致完成了内部测试,目前已经将自主开发的行人检测系统与某景区的票务系统进行了结合,在之前的博文中也和大家分享过我们的开发过程,大家有兴趣也可以翻阅我们以往的博文了解。
将行人检测与票务系统结合的主要目的是确保行人与买票人数进行对应,获取景区的人流量、运营情况等信息,主要实现方式是将票务系统的数据库时间段总人数与Python分析的时间段数据库总人数进行比较。如果票务系统的数据库时间段总人数比较大,那就需要切换视频源来使人数对应上。
在景区测试时,该景区使用的是本地保存的数据库,且用的是微软的SQLServer数据库服务器,而其他景区使用的是mysql数据库,两边使用的数据库不一样,所以在测试的时候出现报错,错误日志:“panic: runtime error: invalid memory address or nil pointer derefernce [signal 0xc000005 code=0x0 addr=0xb0 pc=0xe773ad]”
程序运行错误,是一个无效的内存地址或者空指针引用。初始化程序没有赋值,而直接指定为nil,导致程序调用指针就会报错。
代码示例:
connArgs := "" value := strings.Index(PlayPoint, "bailong") if value >= 0 { connArgs = fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;", localdbhost, localdbuser, localdbpass, localport, "BL_Tick_Push") MDB, err = gorm.Open("mssql", connArgs) if err != nil { return } MDB.SingularTable(true) } else { connArgs = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", tdbuser, tdbpass, tdbhost, tdbport, "orderdata") TDB, err = gorm.Open("mysql", connArgs) if err != nil { return } //把sql语句打印出来 TDB.LogMode(true) db := TDB.DB() err = db.Ping() if err != nil { return } db.SetMaxOpenConns(1) TDB.SetLogger(db2.DefaultGormLogger) }
连接两个数据库,一个是mysql,一个是mssql,都保存了一个全局的变量,所以我们使用的是那个全局变量的数据库,否则MDB和TDB中其中有一个为nil,使用数据库查询会出现nil指针的 *** 作。
我们将代码 *** 作MDB和TDB。
sql = fmt.Sprintf(`SELECt * FROM BI_Inpark WHERe inpark_systemdate BETWEEN %s AND %s AND inparktype=1 AND parkid=%s`, fmt.Sprintf(`'%d-%d-%d %02d:%02d:%02d.000'`, start.Year(), start.Month(), start.Day(), start.Hour(), start.Minute(), start.Second()), fmt.Sprintf(`'%d-%d-%d %02d:%02d:%02d.999'`, end.Year(), end.Month(), end.Day(), end.Hour(), end.Minute(), end.Second()), fmt.Sprintf(`'%d'`,point)) TDB.Raw(sql).Scan(&MDatabaseArr) return MDatabaseArr, MTicketPersonCount(MDatabaseArr)
而此处出现代码错误,此代码 *** 作的是mssql数据库,TDB变量保存的是mysql数据库的值,所以 *** 作数据库全局变量使用错误。此处需要把TDB改为 *** 作(mssql)MDB的数据库即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)