1. 程式人生 > 其它 >TSINGSEE青犀視訊景區行人檢測程式資料庫出錯的排查及解決

TSINGSEE青犀視訊景區行人檢測程式資料庫出錯的排查及解決

我們之前開發的行人檢測系統已經大致完成了內部測試,目前已經將自主開發的行人檢測系統與某景區的票務系統進行了結合,在之前的博文中也和大家分享過我們的開發過程,大家有興趣也可以翻閱我們以往的博文了解。

將行人檢測與票務系統結合的主要目的是確保行人與買票人數進行對應,獲取景區的人流量、運營情況等資訊,主要實現方式是將票務系統的資料庫時間段總人數與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的資料庫即可。