一个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官方文档

相关文章
相关标签/搜索