一個TCP長鏈接設備管理後臺工程(七)

前篇

一個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官方文檔

相關文章
相關標籤/搜索