# sago.v2 **Repository Path**: xiawucha365/sago.v2 ## Basic Information - **Project Name**: sago.v2 - **Description**: 提供一套轻量可控的脚本开发脚手架,降低并发程序开发难度 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2020-04-21 - **Last Updated**: 2025-04-03 ## Categories & Tags **Categories**: code-generator **Tags**: None ## README #sago.v2 #### 介绍 - 历史版本 https://gitee.com/xiawucha365/sago - 西米露,一种富有营养的物质,手工制作 - 提供一套轻量可控的脚本开发脚手架,降低并发程序开发难度 #### 软件功能 - [x] 支持测试/生产环境 配置文件区分, - [x] 日志(持错误分级输出,文件切割(按天/按月),文件自动清理,rgb颜色输出) - [x] 并发 (超时统计,协程池) - [x] 引入依赖注入 - [ ] cmd 脚手架工具等 (生成项目基本目录生成,model文件生成 #### go mod 安装 - 需要安装 mod 包,安装成功后配置环境变量 - export GO111MODULE=on - export GOPROXY=https://goproxy.cn - IDE选择:建议使用goland版本 >= 2019.2,安装好后会自动检测并引入依赖,go mod是golang新出特性,旧版本不支持 ### 使用教程 #### 框架引入 ```go go get gitee.com/xiawucha365/sago.v2 ``` #### 配置文件 dev.toml ```go =================通用配置====================== 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场景,数据库配置信息不建议运行中修改 ######打印配置 ```go //配置打印 sago.Gdi.Invoke(func(cf *config.Config) { sagoutil.PrintType(cf) }) ``` ######日志使用 ```go //日志使用 sago.Gdi.Invoke(func(log *slog.Log) { defer log.Sync() log.Info("log测试") log.Warn("log测试") log.Error("log测试") }) ``` ######数据库操作 ```go 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) } }) } ``` ######并发组件 ```go 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 目录 #### 参与贡献