一個TCP長鏈接設備管理後臺工程(一)
一個TCP長鏈接設備管理後臺工程(二)
一個TCP長鏈接設備管理後臺工程(三)
一個TCP長鏈接設備管理後臺工程(四)
一個TCP長鏈接設備管理後臺工程(五)
一個TCP長鏈接設備管理後臺工程(六)git
Github倉庫地址github
數據庫部分我使用postgresql,爲了簡化上層調用,我又使用了xorm。golang
庫導入sql
import ( "github.com/go-xorm/xorm" _ "github.com/lib/pq" )
建立一個全局引擎指針數據庫
var engine *xorm.Engine
定義一個初始化函數,用來初始化數據庫相關的一些內容:segmentfault
func xormInit(driverName string, dataSourceName string) (*xorm.Engine, error) { }
數據庫中,咱們須要操做四個數據庫表:users、log_frame、dev_info和gps_data。根據golang和xorm的映射關係,咱們先建立對應的四個結構體。由於dev_info和gps_data是提供給term模塊使用的,因此這兩個結構體在term包中函數
type Users struct { Id int `xorm:"pk autoincr notnull id"` Name string `xorm:"name"` Password string `xorm:"password"` IsAdmin bool `xorm:"admin"` Stamp time.Time `xorm:"stamp"` } type LogFrame struct { Id int `xorm:"pk autoincr notnull id"` Stamp time.Time `xorm:"DateTime notnull 'stamp'"` Dir int `xorm:"dir"` Frame string `xorm:"Varchar(2048) frame"` }
type DevInfo struct { Authkey string `xorm:"auth_key"` Imei string `xorm:"imei"` Vin string `xorm:"vin"` PhoneNum string `xorm:"pk notnull phone_num"` ProvId uint16 `xorm:"prov_id"` CityId uint16 `xorm:"city_id"` Manuf string `xorm:"manuf"` TermType string `xorm:"term_type"` TermId string `xorm:"term_id"` PlateColor int `xorm:"plate_color"` PlateNum string `xorm:"plate_num"` } func (d DevInfo) TableName() string { return "dev_info" } type GPSData struct { Imei string `xorm:"pk notnull imei` Stamp time.Time `xorm:"DateTime pk notnull stamp` WarnFlag uint32 `xorm:"warnflag"` State uint32 `xorm:"state"` AccState uint8 `xorm:"accstate"` GpsState uint8 `xorm:"gpsstate"` Latitude uint32 `xorm:"latitude"` Longitude uint32 `xorm:"longitude"` Altitude uint16 `xorm:"altitude"` Speed uint16 `xorm:"speed"` Direction uint16 `xorm:"direction"` } func (d GPSData) TableName() string { return "gps_data" }
咱們能夠經過結構體的TableName方法來指定數據庫表名post
初始化xorm引擎ui
var err error engine, err = xorm.NewEngine(driverName, dataSourceName) if err != nil { return engine, err }
同步數據表結構:指針
users := new(Users) err = engine.Sync2(users) if err != nil { return engine, err } logframe := new(LogFrame) err = engine.Sync2(logframe) if err != nil { return engine, err } gpsdata := new(term.GPSData) err = engine.Sync2(gpsdata) if err != nil { return engine, err } devinfo := new(term.DevInfo) err = engine.Sync2(devinfo) if err != nil { return engine, err }
Sync2會同步結構體到實際的數據庫表上面,若是表不存在,就會自動建立,若是結構體中新增了字段,數據庫中也會增長相應字段。
調用:
engine, err = xormInit("postgres", "postgres://pqgotest:pqgotest@localhost/pqgodb?sslmode=require")
鏈接一個postgres數據庫,地址爲localhost,用戶名爲pqgotest,密碼爲pqgotest,數據庫名爲pqgodb,後面的sslmode爲ssl模式,具體細節網上不少教程,此處不展開。
數據庫的插入操做主要使用xorm的Insert函數,查詢使用xorm的Find和Get。查詢能夠配合Where等函數使用。具體參考xorm官方文檔