efficient是基于Golang gin框架编写的web、command富框架。灵活的应用目录结构,可根据需要自定义目录结构。
efficient 主要基于下面的包进行了封装, 基本保留了原有包的用法
1. 首先需要安装 Go (version 1.10+), 可以使用下面的命令进行安装 efficient.
$ go get github.com/float8/efficient
import "github.com/float8/efficient"
如使用go mod包依赖管理工具,请参考下面命令
$ set GO111MODULE=on
$ export GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
$ export GOPROXY=https://goproxy.cn
$ cat main.go
package main
import (
"github.com/float8/efficient"
"net/http"
)
type TestController struct {
efficient.Controller
}
func (this *TestController) Get(cxt efficient.Context) {
id := cxt.Query("id")
cxt.String(200, "get:"+id)
}
func (this *TestController) Post(cxt efficient.Context) {
id := cxt.PostForm("id")
cxt.String(200, "post:"+id)
}
func main(){
efficient.Routers.Add("/test", &TestController{}, http.MethodGet, http.MethodPost)
efficient.Run()
}
$ cat generate.go
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/float8/efficient/database"
"github.com/float8/efficient/generate"
)
func main() {
//实例化代码生成器
generate := generate.NewGenerate()
//应用生成
generate.Application()
//设置数据库并生成dao和model文件
generate.SetDb("mysql", database.NewDb().
MysqlDsn("127.0.0.1", "3306", "root", "123456", "test", "utf8mb4").
Open()).Database("test")
}
efficient.Config.Addr = ":80"
efficient.Config.Debug = true
efficient.Config.AppName = "efficient"
efficient.Config.Middleware = []Middleware{
func(ctx *Context){},
}
//参考框架 validation/lang
efficient.Config.Lang = Lang{
"validation_no_lang":"不存在此语言KEY'%s',请检查是否拼写错误!",
}
参数1 地址目录的相对目录
参数2 执行的实例化的控制器,控制器必须嵌入efficient.Controller
参数3... 请求方式,请参考http包,可以添加多个,Restful风格
efficient.Routers.
Add("/test", &TestController{}, http.MethodGet, http.MethodPost).
Add("/demo", &DemoController{}, http.MethodGet, http.MethodPut)
控制器必须内嵌efficient.Controller
, 控制器的方法大小写请与http包中的方法名称保持一致,首字母大写即可。
efficient.Context
用法与gin的*Context
用法一致。
package main
import (
"github.com/float8/efficient"
)
type TestController struct {
efficient.Controller
}
func (this *TestController) Get(cxt efficient.Context) {
id := cxt.Query("id")
cxt.String(200, "get:"+id)
}
func (this *TestController) Post(cxt efficient.Context) {
id := cxt.PostForm("id")
cxt.String(200, "post:"+id)
}
database.NewDb().MysqlDsn("地址", "端口", "账户", "密码", "数据库", "数据库编码").Open(func(db *sql.DB) {
db.SetConnMaxIdleTime(time.Minute * 4) //设置最大连接生存时间
db.SetMaxOpenConns(5) //设置最大打开链接数
db.SetMaxIdleConns(5) //设置最大空闲链接
db.SetConnMaxLifetime(time.Minute * 2) //设置连接最大空闲时间
})
数据层采用了model和dao的模式,model和dao可以通过代码生成器进行生成,建议直接采用生成器生成,在此基础上进行增加内容。
model对应的数据表结构。
dao层与model相对,对数据表进行操作。
package model
import (
"encoding/json"
"github.com/float8/efficient/database"
)
//实例化model
func NewUsers() *Users {
m := &Users{}
//mysql 数据库驱动
//test 数据库
//设置model的唯一标识,即当前表名即可
m.Model.Init("mysql","test", "users")
return m
}
//必须内嵌database.Model
//结构体内对应的是表字段和字段信息,最终会把mysql字段类型转化为golang数据类型和自定义的数据类型
type Users struct {
database.Model
Id uint32 `column:"id" type:"int" auto_increment:"true" primary_key:"true" unsigned:"true" precision:"10" scale:"0" comment:"用户编号"`
Username string `column:"username" type:"varchar" unique:"true" length:"100" octet_length:"400" comment:"账户"`
Passwd string `column:"passwd" type:"varchar" length:"100" octet_length:"400" comment:"密码"`
}
//TableName 数据库表明方法
func (u *Users) TableName() string {
return "users"
}
//Ptrs 所有数据表字段对应映射的接口体字段的指针
func (u *Users) Ptrs() map[string]interface{} {
return map[string]interface{}{
"id": &u.Id,
"username": &u.Username,
"passwd": &u.Passwd,
}
}
//Get 根据数据表字段进行获取model字段值
func (u *Users) Get(key string) interface{} {
switch key {
case "id":
return u.Id
case "username":
return u.Username
case "passwd":
return u.Passwd
}
return nil
}
//Set 根据数据表字段进行设置model字段值
func (u *Users) Set(key string, val interface{}) {
switch key {
case "id":
u.Id = val.(uint32)
case "username":
u.Username = val.(string)
case "passwd":
u.Passwd = val.(string)
}
}
//以下是model所有字段的get方法
func (u *Users) GetId() uint32 {
return u.Id
}
func (u *Users) GetUsername() string {
return u.Username
}
func (u *Users) GetPasswd() string {
return u.Passwd
}
//以下是model所有字段的set方法
func (u *Users) SetId(value uint32) *Users {
//添加赋值的字段,因为golang 结构体不能区分是否已经赋值所以使用u.AddAssColumns进行判断是否赋值
u.AddAssColumns("id")
u.Id = value
return u
}
func (u *Users) SetUsername(value string) *Users {
u.AddAssColumns("username")
u.Username = value
return u
}
func (u *Users) SetPasswd(value string) *Users {
u.AddAssColumns("passwd")
u.Passwd = value
return u
}
//InsertEvent Insert时自动触发此事件,在Insert执行之前触发
func (u *Users) InsertEvent() {}
//UpdateEvent Update时自动触发此事件,在Update执行之前触发
func (u *Users) UpdateEvent() {}
//把model格式化成json字符串
func (u *Users) ToString() string {
bytes, _ := json.Marshal(u)
return string(bytes)
}
必须内嵌 database.Model
type Users struct {
database.Model
Id uint32 `column:"id" type:"int" auto_increment:"true" primary_key:"true" unsigned:"true" precision:"10" scale:"0" comment:"用户编号"`
Username string `column:"username" type:"varchar" unique:"true" length:"100" octet_length:"400" comment:"账户"`
Passwd string `column:"passwd" type:"varchar" length:"100" octet_length:"400" comment:"密码"`
}
实例化Model
func NewUsers() *Users {
m := &Users{}
m.init("users") //设置model的唯一标识,即当前表名即可
return m
}
表名的方法;使用方法可以根据字段信息执行自定义分表
func (u *Users) TableName() string {
return "表名"
}
所有数据表字段对应Model字段的指针;主要用于dao的封装中
func (u *Users) Ptrs() map[string]interface{} {
return map[string]interface{}{
"id": &u.Id,
"username": &u.Username,
"passwd": &u.Passwd,
}
}
根据数据表字段获取Model字段的值
func (u *Users) Get(key string) interface{} {
switch key {
case "id":
return u.Id
case "username":
return u.Username
case "passwd":
return u.Passwd
}
return nil
}
根据数据表字段设置Model字段的值
func (u *Users) Set(key string, val interface{}) {
switch key {
case "id":
u.Id = val.(uint32)
case "username":
u.Username = val.(string)
case "passwd":
u.Passwd = val.(string)
}
}
Insert时自动触发此事件,在Insert执行之前触发
func (u *Users) InsertEvent() {}
Update时自动触发此事件,在Update执行之前触发
func (u *Users) UpdateEvent() {}
把model格式化成json字符串
func (u *Users) ToString() string {
bytes, _ := json.Marshal(u)
return string(bytes)
}
把model格式化成json字符串
func (u *Users) ToString() string {
bytes, _ := json.Marshal(u)
return string(bytes)
}
column 表字段,字符串
type 表类型,字符串
enum 枚举类型的选项值,值的格式:{'北京','上海','重庆'}"
auto_increment 是否自增,字符串的布尔型,true:代表自增
primary_key 是否是主键,字符串的布尔型,true:代表主键
unique 是否是唯一索引,字符串的布尔型,true:代表是唯一索引
unsigned 是否有符号,字符串的布尔型,true:没有符号
null 字段是否为空,字符串的布尔型,true:空
precision 数字精度
scale 小数位精度
length 字符串长度
octet_length 字符串字节长度
default 默认值
comment 字段注释,可以进行修改作为验证器的提示文字
on_insert_time insert时自动添加时间
on_update_time update时自动添加时间
validators 验证器,验证器请参考 validation
数据类型请保持与字段的原生即golang原始类型一致
validators="gt,lt" v-gt="int:5" v-lt="int:20"
字段默认不为空的情况下mysql类型对应的golang类型,包含有符号和无符号类型
var types = map[string]goType{
"time": {
name: "string",
},
"date": {
name: "database.Date",
pkg: "github.com/float8/efficient/database",
},
"datetime": {
name: "database.Time",
pkg: "github.com/float8/efficient/database",
},
"timestamp": {
name: "database.Time",
pkg: "github.com/float8/efficient/database",
},
"year": {
name: "string",
},
"decimal": {
name: "decimal.Decimal",
pkg: "github.com/shopspring/decimal",
},
"numeric": {
name: "decimal.Decimal",
pkg: "github.com/shopspring/decimal",
},
"bit": {
name: "database.Bit",
pkg: "github.com/float8/efficient/database",
},
"bits": {
name: "database.Bits",
pkg: "github.com/float8/efficient/database",
},
"char": {
name: "string",
},
"varchar": {
name: "string",
},
"tinytext": {
name: "string",
},
"text": {
name: "string",
},
"mediumtext": {
name: "string",
},
"longtext": {
name: "string",
},
"enum": {
name: "string",
},
"set": {
name: "database.Set",
pkg: "github.com/float8/efficient/database",
},
"tinyint": {
name: "int8",
unsigned: goUtype{name: "uint8"},
},
"smallint": {
name: "int16",
unsigned: goUtype{name: "uint16"},
},
"mediumint": {
name: "int32",
unsigned: goUtype{name: "uint32"},
},
"int": {
name: "int32",
unsigned: goUtype{name: "uint32"},
},
"integer": {
name: "int32",
unsigned: goUtype{name: "uint32"},
},
"bigint": {
name: "int64",
unsigned: goUtype{name: "uint64"},
},
"double": {
name: "float64",
},
"float": {
name: "float64",
},
"real": {
name: "float64",
},
}
字段默认为空的情况下mysql类型对应的golang类型,包含有符号和无符号类型
var nullTypes = map[string]goType{
"date": {
name: "database.NullDate",
pkg: "github.com/float8/efficient/database",
},
"datetime": {
name: "database.NullTime",
pkg: "github.com/float8/efficient/database",
},
"timestamp": {
name: "database.Time",
pkg: "github.com/float8/efficient/database",
},
"time": {
name: "sql.NullString",
pkg: "database/sql",
},
"year": {
name: "sql.NullString",
pkg: "database/sql",
},
"bit": {
name: "database.NullBit",
pkg: "github.com/float8/efficient/database",
},
"bits": {
name: "database.NullBits",
pkg: "github.com/float8/efficient/database",
},
"char": {
name: "sql.NullString",
pkg: "database/sql",
},
"varchar": {
name: "sql.NullString",
pkg: "database/sql",
},
"tinytext": {
name: "sql.NullString",
pkg: "database/sql",
},
"text": {
name: "sql.NullString",
pkg: "database/sql",
},
"mediumtext": {
name: "sql.NullString",
pkg: "database/sql",
},
"longtext": {
name: "sql.NullString",
pkg: "database/sql",
},
"enum": {
name: "sql.NullString",
pkg: "database/sql",
},
"set": {
name: "database.NullSet",
pkg: "github.com/float8/efficient/database",
},
"double": {
name: "sql.NullFloat64",
pkg: "database/sql",
},
"float": {
name: "sql.NullFloat64",
pkg: "database/sql",
},
"real": {
name: "sql.NullFloat64",
pkg: "database/sql",
},
"decimal": {
name: "decimal.Decimal",
pkg: "github.com/shopspring/decimal",
},
"numeric": {
name: "decimal.Decimal",
pkg: "github.com/shopspring/decimal",
},
"tinyint": {
name: "database.NullInt8",
pkg: "github.com/float8/efficient/database",
unsigned: goUtype{
name: "database.NullUint8",
pkg: "github.com/float8/efficient/database",
},
},
"smallint": {
name: "sql.NullInt16",
pkg: "database/sql",
unsigned: goUtype{
name: "database.NullUint16",
pkg: "github.com/float8/efficient/database",
},
},
"mediumint": {
name: "sql.NullInt32",
pkg: "database/sql",
unsigned: goUtype{
name: "database.NullUint32",
pkg: "github.com/float8/efficient/database",
},
},
"int": {
name: "sql.NullInt32",
pkg: "database/sql",
unsigned: goUtype{
name: "database.NullUint32",
pkg: "github.com/float8/efficient/database",
},
},
"integer": {
name: "sql.NullInt32",
pkg: "database/sql",
unsigned: goUtype{
name: "database.NullUint32",
pkg: "github.com/float8/efficient/database",
},
},
"bigint": {
name: "sql.NullInt64",
pkg: "database/sql",
unsigned: goUtype{
name: "database.NullUint64",
pkg: "github.com/float8/efficient/database",
},
},
}
因为框架初始化时会解析结构体标签所以必须对Model进行注册
database.RegisterModel(NewUsers())
在应用时可设置父Model,表Model可以直接嵌入父Model
package model
import "github.com/float8/efficient/database"
type Model struct {
database.Model
}
func (m *Model) init(key string) *Model {
m.Model.Init("mysql","test", key)
return m
}
func init() {
database.RegisterModel(NewUsers())
}
func NewUsers() *Users {
m := &Users{}
m.init("users")
return m
}
type Users struct {
Model
Id uint32 `column:"id" type:"int" auto_increment:"true" primary_key:"true" unsigned:"true" precision:"10" scale:"0" comment:"用户编号"`
Username string `column:"username" type:"varchar" unique:"true" length:"100" octet_length:"400" comment:"账户"`
Passwd string `column:"passwd" type:"varchar" length:"100" octet_length:"400" comment:"密码"`
}
package dao
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/float8/efficient.demo/application/model"
"github.com/float8/efficient/database"
"time"
)
//请重新配置数据连接信息
var db = func() *sql.DB {
return database.NewDb().MysqlDsn("127.0.0.1", "3306", "root", "123456", "test", "utf8mb4").Open(func(db *sql.DB) {
db.SetConnMaxIdleTime(time.Minute * 4) //设置最大连接生存时间
db.SetMaxOpenConns(5) //设置最大打开链接数
db.SetMaxIdleConns(5) //设置最大空闲链接
db.SetConnMaxLifetime(time.Minute * 2) //设置连接最大空闲时间
})
}()
func NewUsersDao(db *sql.DB) *UsersDao {
d := &UsersDao{}
d.SetDb("mysql", db)
d.SetModel(func() database.ModelInterface {
return model.NewUsers()
})
return d
}
type UsersDao struct {
database.Dao
}
必须内嵌 database.Dao
type UsersDao struct {
database.Dao
}
d.SetDb(db) 设置数据库连接,数据类型:*sql.DB
d.DriverName("mysql") 设置数据库驱动
d.SetModel(func() database.ModelInterface { return model.NewUsers()}) 设置Dao使用的模型
func NewUsersDao(db *sql.DB) *UsersDao {
d := &UsersDao{}
d.SetDb("mysql", db)
d.SetModel(func() database.ModelInterface {
return model.NewUsers()
})
return d
}
应用时可以设置父Dao
package dao
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/float8/efficient.demo/config"
"github.com/float8/efficient/database"
)
var db = func() *sql.DB {
return database.NewDb().MysqlDsn(
config.DbConfig.Addr,
config.DbConfig.Port,
config.DbConfig.Account,
config.DbConfig.Passwd,
config.DbConfig.Dbname,
config.DbConfig.Charset,
).Open(func(db *sql.DB) {
db.SetConnMaxLifetime(config.DbConfig.SetConnMaxLifetime) //设置最大连接生存时间
db.SetConnMaxIdleTime(config.DbConfig.ConnMaxIdleTime) //设置连接最大空闲时间
db.SetMaxOpenConns(config.DbConfig.MaxOpenConns) //设置最大打开链接数
db.SetMaxIdleConns(config.DbConfig.MaxIdleConns) //设置最大空闲链接
})
}()
type Dao struct {
database.Dao
}
func (d *Dao) Init(fun func() database.ModelInterface) *Dao {
d.SetDb("mysql", db)
d.SetModel(fun)
return d
}
package dao
import (
"efficient.demo/application/model"
"github.com/float8/efficient/database"
)
func NewUsersDao() *UsersDao {
d := &UsersDao{}
d.Init(func() database.ModelInterface {return model.NewUsers()})
return d
}
type UsersDao struct {
Dao
}
func (d *Dao) Insert() (result sql.Result, err error)
package main
import (
"fmt"
"github.com/float8/efficient.demo/application/dao"
"github.com/float8/efficient.demo/application/model"
"math/rand"
"strconv"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
users := model.NewUsers()
users.SetUsername("zhangsan-" + strconv.FormatUint(rand.Uint64(), 10)).
SetPasswd("123456").
SetAge(10)
userDao := dao.NewUsersDao()
ret,_ := userDao.SetData(users).Insert()
fmt.Println(ret.LastInsertId())
}
设置数据
func (d *Dao) SetData(data ...ModelInterface) *Dao
执行插入操作
func (d *Dao) Insert() (result sql.Result, err error)
package main
import (
"fmt"
"github.com/float8/efficient.demo/application/dao"
"github.com/float8/efficient.demo/application/model"
)
func main() {
users := model.NewUsers()
users.SetUsername("lisi").
SetPasswd("456789").
SetAge(5)
usersDao := dao.NewUsersDao()
rowsAffected, err := usersDao.SetData(users).Where("id=?", 1342).Update()
fmt.Println("Update:", rowsAffected, err)
}
设置数据
func (d *Dao) SetData(data ...ModelInterface) *Dao
设置条件
func (d *Dao) Where(where string, args ...interface{}) *Dao
执行修改操作
func (d *Dao) Update() (rowsAffected int64, err error)
package main
import (
"fmt"
"github.com/float8/efficient.demo/application/dao"
"github.com/float8/efficient.demo/application/model"
)
func main() {
usersDao := dao.NewUsersDao()
rowsAffected, err := usersDao.Where("id=?", 1342).Delete()
fmt.Println("Delete:", rowsAffected, err)
}
设置条件
func (d *Dao) Update() (rowsAffected int64, err error)
执行删除操作
func (d *Dao) Delete() (rowsAffected int64, err error)
package main
import (
"fmt"
"github.com/float8/efficient.demo/application/dao"
)
func main() {
userDao := dao.NewUsersDao()
row := userDao.QueryRow("select id,username,passwd from users where id=?", 100)
var id int64
var username string
var passwd string
row.Scan(&id, &username, &passwd)
fmt.Println(id, username, passwd)
}
单行查询
func (d *Dao) QueryRow(query string, args ...interface{}) *sql.Row
获取行结果
var id int64
var username string
var passwd string
row.Scan(&id, &username, &passwd)
package main
import (
"fmt"
"github.com/float8/efficient.demo/application/dao"
)
func main() {
userDao := dao.NewUsersDao()
result := userDao.Query("select id,username,passwd from users where passwd=?", "123")
rows, err := result.ToModels()
fmt.Println(rows, err)
}
执行多行查询
func (d *Dao) Query(query string, args ...interface{}) *query
原生获取多行数据
func (q *query) Rows() (*sql.Rows, error)
Rows 示例代码
rows, err := result.Rows()
defer func() {
err := rows.Close()
if err != nil {
fmt.Println(err)
}
}()
if err != nil {
fmt.Println(err)
}
if err != nil {
fmt.Println(err)
}
ret := []map[string]interface{}{}
for rows.Next() {
var id int64
var username string
var passwd string
rows.Scan(&id, &username, &passwd)
ret = append(ret, map[string]interface{}{
"id":id,
"username":username,
"passwd":passwd,
})
}
err = rows.Close()
if err != nil {
fmt.Println(err)
}
fmt.Println("rows=============", ret)
把结果集放入 []map[string]interface{}
func (q *query) ToMaps() (result []map[string]interface{}, err error)
获取单行数据,把结果集放入map[string]interface{}
使用Query()获取单行数据一定要加limit 1
func (q *query) ToMap() (result map[string]interface{}, err error)
把结果集放入 []ModelInterface
func (q *query) ToModels() (models []ModelInterface, err error)
获取单行数据,把结果集放入 ModelInterface
使用Query()获取单行数据一定要加limit 1
func (q *query) ToModel() (model ModelInterface, err error)
result, err := userDao.Exec("delete from users where id=?", 10)
if err != nil {
return 0, err
}
result.RowsAffected()
执行SQL
func (d *Dao) Exec(query string, args ...interface{}) (result sql.Result, err error)
package main
import (
"fmt"
"github.com/float8/efficient.demo/application/dao"
)
func main() {
var err error
var rowsAffected int64
usersDao := dao.NewUsersDao()
usersDao.Begin()
defer func() {
if err != nil {
_ = usersDao.Rollback()
}
}()
rowsAffected, err = usersDao.Where("id=?", 1342).Delete()
fmt.Println("rowsAffected:", rowsAffected)
if err != nil {
err = usersDao.Rollback()
} else {
err = usersDao.Commit()
}
fmt.Println("Delete:", err)
}
创建事务
func (d *Dao) Begin() *Dao
提交事务
func (d *Dao) Commit() error
回滚事务
func (d *Dao) Rollback() error
package main
import (
"fmt"
"github.com/float8/efficient/validation"
)
func main() {
errs := validation.NewValidation().
Validator("num", 101.1, validation.V{"gte": 5.1, "lte": 100.1}, "数量").
Validator("num1", 101, validation.V{"gte": 5, "lte": 100}, "数量").
Errors()
fmt.Println(errs)
}
import "github.com/float8/efficient/validation"
做数据验证前,先对验证器进行实例化
validation.NewValidation()
添加验证规则
key 需要验证的数据标识,如:验证数据为用户名,key即可为username
data 需要验证的数据
validators 验证规则
comments 要验证的数据的注释,如:key为id,comment为编号
func (v *Validation) Validator(key string, data interface{}, validators V, comments ...string) *Validation
验证规则,底层数据结构为 map[string]interface{}
key 为验证规则的英文名称,即验证器
value 为规则的数据,规则数据要与验证的数据的类型保持一致,否则验证失败报类型不匹配错误
validation.V{"gte": 5.1, "lte": 100.1}
支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string bool
支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string bool
支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string
支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string
支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string
支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string
验证数据支持的数据类型
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string
验证规则数据为验证数据的数组形式,如:[]int8
验证数据和验证规则数据支持的数据类型为下面类型的数组形式,如:[]int8
int8 uint8 int16 uint16 int uint int32 uint32 int64 uint64 float32 float64 string
支持的数据类型 string
支持的数据类型 string
支持的数据类型 string
支持的数据类型 nil
使用的是日志插件logrus,对外暴露的efficient.Log
,错误级别调用的方法都与logrus一致
https://github.com/sirupsen/logrus
gin的 gin.DefaultWriter
和 gin.DefaultErrorWriter
可以分别设置
示例代码
package config
import (
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"github.com/float8/efficient"
"os"
)
func init() {
env := efficient.GetEnv()
if env == "production" {
gin.DefaultWriter = os.Stdout
gin.DefaultErrorWriter = os.Stderr
efficient.SetLogger(func(logger *logrus.Logger, log *logrus.Entry) {
logger.SetReportCaller(false)
log = logrus.NewEntry(logger)
logger.Out = os.Stdout
})
}
}
import "github.com/float8/efficient"
package config
import (
"github.com/sirupsen/logrus"
"github.com/float8/efficient"
)
func init() {
env := efficient.GetEnv()
if env == "production" {
efficient.SetLogger(func(logger *logrus.Logger, log *logrus.Entry) {
logger.SetReportCaller(false)
log = logrus.NewEntry(logger)
})
}
}
可对*logrus.Logger
进行设置,对*logrus.Entry
进行初始化
func SetLogger(fun func(logger *logrus.Logger, log *logrus.Entry))
import "github.com/float8/efficient"
默认production
efficient.GetEnv()
$ set EFFICIENT_ENV=test
$ export EFFICIENT_ENV=test
可以把配置信息提取到配置文件中
//实例化代码生成器
generate := generate.NewGenerate()
//应用生成
generate.Application()
//设置数据库并生成dao和model文件
db : = database.NewDb().MysqlDsn("127.0.0.1", "3306", "root", "123456", "test", "utf8mb4").Open()
generate.SetDb("mysql", db).Database("test")
暂只支持Mysql模型生成,可根据情况导入下面的包
github.com/go-sql-driver/mysql mysql连接驱动包
github.com/float8/efficient/database 数据层包
github.com/float8/efficient/generate 生成器的包
import (
_ "github.com/go-sql-driver/mysql"
"github.com/float8/efficient/database"
"github.com/float8/efficient/generate"
)
generate.NewGenerate()
//此目录是默认目录,无特殊需要可以不设置,需要在调用Application()前调用此方法
appdirs := map[string]string{
"dao": "application/dao",
"model": "application/model",
"service": "application/service",
"config": "config",
"cmd": "cmd",
}
generate.SetAppDir(appdirs)
应用目录参考'应用目录设置'
NewGenerate().Application()
generate.
//设置数据库连接
SetDb("驱动", database.NewDb().MysqlDsn("127.0.0.1", "3306", "root", "123456", "test", "utf8mb4").Open()).
//生成数据层文件
Database("数据库")
注册的数据类型主要用于代码生成的类型注册,一般情况用不到
import "github.com/float8/efficient/generate/database/mysql/generate"
注册mysql对应的golang数据类型,非NULL值的
unsigned 是否有符号
mType mysql数据类型
gType golang数据类型
pkgs golang的类型包,只能写一个
func RegisterType(unsigned bool, mType, gType string, pkgs ...string)
注册mysql对应的golang数据类型,可NULL值的
unsigned 是否有符号
mType mysql数据类型
gType golang数据类型
pkgs golang的类型包,只能写一个
func RegisterNullType(unsigned bool, mType, gType string, pkgs ...string)
import "github.com/float8/efficient/validation"
注册验证器
name 验证器名称
validation 验证器
func RegisterValidation(name string, validation ValidationHandle)
import "github.com/float8/efficient/generate"
注册生成器
driver 数据库驱动
generate 生成器
func RegisterGenerate(driver string, generate GenerateInterface)
import "github.com/float8/efficient/database"
注册SQL生成器
driver 数据库驱动
sql sql生成器
func RegisterSQLS(driver string, sql SQLInterface)
参见 tools
包