#sago.v2
介绍
软件功能
- 支持测试/生产环境 配置文件区分,
- 日志(持错误分级输出,文件切割(按天/按月),文件自动清理,rgb颜色输出)
- 并发 (超时统计,协程池)
- 引入依赖注入
- cmd 脚手架工具等 (生成项目基本目录生成,model文件生成
go mod 安装
使用教程
框架引入
go get gitee.com/xiawucha365/sago.v2
配置文件 dev.toml
=================通用配置======================
app_name = "sago"
app_version = "2.3"
debug = false //debug模式下输出更详细错误信息
==============orm============================
[mysql]
addr = "127.0.0.1:3376"
username = "mfw_dev"
password = ""
charset = "utf8"
dbname = ""
#支持xrom/gorm切换
engine = "xorm"
[mongodb]
addrs = ["127.0.0.1:3376","127.0.0.2:3376","127.0.0.3:3376"] //支持副本集以及单节点模式
username = ""
password = ""
dbname = ""
replica_set = ""
engine = "mgo"
#redis设置
[redis]
addr = ""
password = ""
#===============log=========================
[log]
#日志目录(绝对目录),默认与可执行文件同目录
log_dir = ""
#文件分割周期 month(按月) day(按天)
split_duration = "month"
#日志文件保存等级 info > warn > error 默认为info
level = "error"
#保留最近多少天的日志,过期自动清理
max_age = 30
###备注
支持配置热加载,比如程序运行中需要修改debug=true场景,数据库配置信息不建议运行中修改
######打印配置
//配置打印
sago.Gdi.Invoke(func(cf *config.Config) {
sagoutil.PrintType(cf)
})
######日志使用
//日志使用
sago.Gdi.Invoke(func(log *slog.Log) {
defer log.Sync()
log.Info("log测试")
log.Warn("log测试")
log.Error("log测试")
})
######数据库操作
import (
"fmt"
"math/rand"
"time"
sago "gitee.com/xiawucha365/sago.v2"
"gitee.com/xiawucha365/sago.v2/core/config"
slog "gitee.com/xiawucha365/sago.v2/core/log"
sagoutil "gitee.com/xiawucha365/sago.v2/core/util"
"gitee.com/xiawucha365/sago.v2/core/orm"
"gopkg.in/mgo.v2/bson"
)
func main(){
//mysql=============================================================================================================
//mysql 框架本身查询语句
sago.Gdi.Invoke(func(db *orm.Db) {
var demos []Demo
_ = db.FindBySql("select * from t_creator_center limit 2", &demos)
fmt.Println("xorm 框架查询")
sagoutil.PrintType(demos)
})
//mysql xorm引擎 原生查询语句
sago.Gdi.Invoke(func(db *orm.DbMysql) {
var demos []Demo
res, err := db.Engine.Xorm.QueryString("select * from t_creator_center limit 2")
if err != nil {
panic(err)
} else {
if res1, err := sagoutil.JsonEncode(res); err != nil {
panic(err)
} else {
_ = sagoutil.JsonDecode(res1, &demos)
}
}
fmt.Println("xorm 原生查询")
sagoutil.PrintType(demos)
})
//mysql gorm引擎 原生查询语句 需要修改配置文件mysql-engine为gorm
//sago.Gdi.Invoke(func(db sago.GDbParams) {
//
// var demos []Demo
// res := db.Mysql.Engine.Gorm.Raw("select * from t_creator_center limit 2").Find(&demos)
// if res.Error != nil {
// panic(res.Error)
// } else {
// fmt.Println("gorm 原生查询")
// sagoutil.PrintType(demos)
// }
//})
//指定数据库
sago.Gdi.Invoke(func(cf *config.Config) {
db := orm.GetMysqlConnByDb(cf, "gorm", "sale_contact")
var demos []Demo2
_ = db.FindBySql("select * from t_hm_friend limit 2", &demos)
fmt.Println("指定数据库查询")
sagoutil.PrintType(demos)
})
//使用addr查询
sago.Gdi.Invoke(func(cf *config.Config) {
db := orm.GetMysqlConnByAddr(cf, "",
"mfw_dev:2cB509cc0bf@tcp(127.0.0.1:3376)/sale_spider?charset=utf8&parseTime=True&loc=Local")
var demos []Demo
_ = db.FindBySql("select * from t_creator_center limit 2", &demos)
fmt.Println("指定ddr查询")
sagoutil.PrintType(demos)
})
//mongodb================================================
//框架查询语句-待封装
//mgo 原生查询
sago.Gdi.Invoke(func(db *orm.DbMongodb) {
var demo Item2
if err := db.Engine.Mgo.C("video_info").Find(bson.M{"ptype": "YD"}).One(&demo); err != nil {
panic(err)
} else {
fmt.Println("mongo查询")
sagoutil.PrintType(demo)
}
})
}
######并发组件
import (
"fmt"
"math/rand"
"time"
"gitee.com/xiawucha365/sago.v2/parallel"
)
type worker struct {
ID int
}
func (m *worker) Task() error {
fmt.Println("job:" , m.ID , "runing...")
timen := rand.Intn(3)
//fmt.Println(timen,"seconds")
time.Sleep(time.Second * time.Duration(timen))
fmt.Println("job:" , m.ID , "over")
return nil
}
func main(){
var items []int
for i:=1;i<=100;i++ {
items = append(items,i)
}
sp := parallel.NewSPool(5, len(items),0,false)
for _,id:= range items {
np := worker{ID: id}
sp.Commit(&np)
}
sp.Runtimelog()
sp.Release()
}
###更多例子
见 examples 目录
参与贡献