19

一个TCP长连接设备管理后台工程(七)

 4 years ago
source link: https://studygolang.com/articles/25735
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前篇

Github仓库地址

数据库操作

数据库部分我使用postgresql,为了简化上层调用,我又使用了xorm。

库导入

import (
    "github.com/go-xorm/xorm"
    _ "github.com/lib/pq"
)

创建一个全局引擎指针

var engine *xorm.Engine

定义一个初始化函数,用来初始化数据库相关的一些内容:

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方法来指定数据库表名

初始化xorm引擎

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK