golang操作数据库,之前用官方库"github.com/go-sql-driver/mysql"
对数据的处理很麻烦,代码一大堆,后来看到研发同事的代码都在用"github.com/jinzhu/gorm"
代码非常简洁,代码逻辑看起来也清晰,对于大并发处理也很友好,改进了下自己常用的代码:
package request
import (
"github.com/jinzhu/gorm"
"fmt"
)
type IManagement struct {//先定义数据结构
IflyOSDevID string `gorm:"column:iflyos_devid"`
}
type DeviceInfo struct{
Mac string `gorm:column:mac`
Sn string `gorm:column:sn`
Model string `gorm:column:model`
Device_id string `gorm:column:device_id`
}
func openDb(table string) *gorm.DB {//连接和mysql server一样用open()方法
db, err := gorm.Open("mysql", "aliyuncs.com)/"+table+"?charset=utf8&parseTime=True&loc=Local")
//defer db.Close()
if err != nil {
fmt.Println(err)
panic("连接数据库失败")
}
db.SingularTable(true)
db.LogMode(false)
return db
}
func Getdb(){
db:=openDb("launcher")
var iManagements []IManagement
sql := "select iflyos_devid from iflyos_management"
fmt.Println(sql)
db.Raw(sql).Scan(&iManagements)
fmt.Println(len(iManagements))
fmt.Println(iManagements)
db.Close()
// db = db.Exec("update iflyos_active set device_id='', active_iflyos=1,active_kugou=1,kugou_expire=0,status=1,expire_reason=Null,iflyos_active_time=0,kugou_active_time=0")
// fmt.Println("更新了", db.RowsAffected, "条数据")
// db = db.Exec("update iflyos set iflyos_devid='', assign_count=0")
// fmt.Println("更新了", db.RowsAffected, "条数据")
// db = db.Exec("truncate iflyos_record")
// fmt.Println("更新了", db.RowsAffected, "条数据")
}
func Getdbdev(){
// 删除数据
db:=openDb("aiot")
var Devices []DeviceInfo
sql := "select mac,sn,device_id,model from aiot.device_info order by id desc limit 100"
fmt.Println(sql)
db.Raw(sql).Scan(&Devices)
fmt.Println(len(Devices))
fmt.Println(Devices)
db.Close()
// db = db.Exec("update iflyos_active set device_id='', active_iflyos=1,active_kugou=1,kugou_expire=0,status=1,expire_reason=Null,iflyos_active_time=0,kugou_active_time=0")
// fmt.Println("更新了", db.RowsAffected, "条数据")
// db = db.Exec("update iflyos set iflyos_devid='', assign_count=0")
// fmt.Println("更新了", db.RowsAffected, "条数据")
// db = db.Exec("truncate iflyos_record")
// fmt.Println("更新了", db.RowsAffected, "条数据")
}
db.Raw(sql):返回一个*DB的结构体,结构体包含value,value是一个interface{}
Scan():返回的是你要的结构体,用于将上面的value(interface{})扫描进你需要的struct
源码中的DB结构体:
// DB contains information for current db connection
type DB struct {
sync.RWMutex//锁
Value interface{}//值
Error error//错误信息
RowsAffected int64//受影响的行数
// single db
db SQLCommon
blockGlobalUpdate bool
logMode logModeValue
logger logger
search *search
values sync.Map
// global db
parent *DB
callbacks *Callback
dialect Dialect
singularTable bool
// function to be used to override the creating of a new timestamp
nowFuncOverride func() time.Time
}
常用的这几项:
sync.RWMutex//锁
Value interface{}//值
Error error//错误信息
RowsAffected int64//受影响的行数