迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:gorose开源软件地址:https://gitee.com/gohouse/gorose开源软件介绍:GoRose ORM _______ ______ .______ ______ _______. _______ / _____| / __ \ | _ \ / __ \ / || ____|| | __ | | | | | |_) | | | | | | (----`| |__ | | |_ | | | | | | / | | | | \ \ | __| | |__| | | `--' | | |\ \----.| `--' | .----) | | |____ \______| \______/ | _| `._____| \______/ |_______/ |_______| 翻译简介gorose是一个golang orm框架, 借鉴自laravel的eloquent.gorose 2.0 采用模块化架构, 通过interface的api通信,严格的上层依赖下层.每一个模块都可以拆卸, 甚至可以自定义为自己喜欢的样子. 安装
require github.com/gohouse/gorose/v2 v2.1.2
docker run -it --rm ababy/gorose sh -c "go run main.go"
go get -u github.com/gohouse/gorose/v2 文档支持驱动
api预览db.Table().Fields().Where().GroupBy().Having().OrderBy().Limit().Select()db.Table().Data().Insert()db.Table().Data().Where().Update()db.Table().Where().Delete() 简单用法示例package mainimport ( "fmt" "github.com/gohouse/gorose/v2" _ "github.com/mattn/go-sqlite3")var err errorvar engin *gorose.Enginfunc init() { // 全局初始化数据库,并复用 // 这里的engin需要全局保存,可以用全局变量,也可以用单例 // 配置&gorose.Config{}是单一数据库配置 // 如果配置读写分离集群,则使用&gorose.ConfigCluster{} engin, err = gorose.Open(&gorose.Config{Driver: "sqlite3", Dsn: "./db.sqlite"}) // mysql示例, 记得导入mysql驱动 github.com/go-sql-driver/mysql // engin, err = gorose.Open(&gorose.Config{Driver: "mysql", Dsn: "root:root@tcp(localhost:3306)/test?charset=utf8&parseTime=true"})}func DB() gorose.IOrm { return engin.NewOrm()}func main() { // 原生sql, 直接返回结果集 res,err := DB().Query("select * from users where uid>? limit 2", 1) fmt.Println(res) affected_rows,err := DB().Execute("delete from users where uid=?", 1) fmt.Println(affected_rows, err) // orm链式操作,查询单条数据 res, err = DB().Table("users").First() // res 类型为 map[string]interface{} fmt.Println(res) // orm链式操作,查询多条数据 res2, _ := DB().Table("users").Get() // res2 类型为 []map[string]interface{} fmt.Println(res2)} 使用建议gorose提供数据对象绑定(map, struct), 同时支持字符串表名和map数据返回. 提供了很大的灵活性 配置和链接初始化简单配置 var configSimple = &gorose.Config{ Driver: "sqlite3", Dsn: "./db.sqlite",} 更多配置, 可以配置集群,甚至可以同时配置不同数据库在一个集群中, 数据库会随机选择集群的数据库来完成对应的读写操作, 其中master是写库, slave是读库, 需要自己做好主从复制, 这里只负责读写 var config = &gorose.ConfigCluster{ Master: []&gorose.Config{}{configSimple} Slave: []&gorose.Config{}{configSimple} Prefix: "pre_", Driver: "sqlite3",} 初始化使用 var engin *gorose.Enginengin, err := Open(config)if err != nil { panic(err.Error())} 原生sql操作(增删改查), session的使用创建用户表 DROP TABLE IF EXISTS "users";CREATE TABLE "users" ( "uid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "age" integer NOT NULL);INSERT INTO "users" VALUES (1, 'gorose', 18);INSERT INTO "users" VALUES (2, 'goroom', 18);INSERT INTO "users" VALUES (3, 'fizzday', 18); 定义表struct type Users struct { Uid int `gorose:"uid"` Name string `gorose:"name"` Age int `gorose:"age"`}// 设置表名, 如果没有设置, 默认使用struct的名字func (u *Users) TableName() string { return "users"} 原生查询操作 // 这里是要绑定的结构体对象// 如果你没有定义结构体, 则可以直接使用map, map示例// var u = gorose.Data{}// var u = gorose.Map{} 这两个都是可以的var u Userssession := engin.NewSession()// 这里Bind()是为了存放结果的, 如果你使用的是NewOrm()初始化,则可以直接使用 NewOrm().Table().Query()_,err := session.Bind(&u).Query("select * from users where uid=? limit 2", 1)fmt.Println(err)fmt.Println(u)fmt.Println(session.LastSql()) 原生增删改操作 session.Execute("insert into users(name,age) values(?,?)(?,?)", "gorose",18,"fizzday",19)session.Execute("update users set name=? where uid=?","gorose",1)session.Execute("delete from users where uid=?", 1) 对象关系映射, orm的使用
var u Usersdb := engin.NewOrm()err := db.Table(&u).Fields("name").AddFields("uid","age").Distinct().Where("uid",">",0).OrWhere("age",18). Group("age").Having("age>1").OrderBy("uid desc").Limit(10).Offset(1).Select()
type user gorose.Map// 或者 以下的type定义, 都是可以正常解析的type user2 map[string]interface{}type users3 []usertype users4 []map[string]stringtype users5 []gorose.Maptype users6 []gorose.Data
db.Table(&user).Select()db.Table(&users4).Limit(5).Select()
这里使用的 gorose.Data , 实际上就是
db.Table(&user2).Limit(10.Select()db.Table(&user2).Where("uid", 1).Data(gorose.Data{"name","gorose"}).Update()db.Table(&user2).Data(gorose.Data{"name","gorose33"}).Insert()db.Table(&user2).Data([]gorose.Data{{"name","gorose33"},"name","gorose44"}).Insert()db.Table(&user2).Where("uid", 1).Delete() 最终sql构造器, builder构造不同数据库的sql目前支持 mysql, sqlite3, postgres, oracle, mssql, clickhouse等符合 binder, 数据绑定对象这一部分也是用户无感知的, 主要是传入的绑定对象解析和数据绑定, 同样是为了开发者个性化定制而独立出来的 模块化gorose2.0 完全模块化, 每一个模块都封装了interface接口api, 模块间调用, 都是通过接口, 上层依赖下层
以上主模块, 都相对独立, 可以个性化定制和替换, 只要实现相应模块的接口即可. 最佳实践sql DROP TABLE IF EXISTS "users";CREATE TABLE "users" ( "uid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "age" integer NOT NULL);INSERT INTO "users" VALUES (1, 'gorose', 18);INSERT INTO "users" VALUES (2, 'goroom', 18);INSERT INTO "users" VALUES (3, 'fizzday', 18); 实战代码 package mainimport ( "fmt" "github.com/gohouse/gorose/v2" _ "github.com/mattn/go-sqlite3")type Users struct { Uid int64 `gorose:"uid"` Name string `gorose:"name"` Age int64 `gorose:"age"` Xxx interface{} `gorose:"-"` // 这个字段在orm中会忽略}func (u *Users) TableName() string { return "users"}var err errorvar engin *gorose.Enginfunc init() { // 全局初始化数据库,并复用 // 这里的engin需要全局保存,可以用全局变量,也可以用单例 // 配置&gorose.Config{}是单一数据库配置 // 如果配置读写分离集群,则使用&gorose.ConfigCluster{} engin, err = gorose.Open(&gorose.Config{Driver: "sqlite3", Dsn: "./db.sqlite"})}func DB() gorose.IOrm { return engin.NewOrm()}func main() { // 这里定义一个变量db, 是为了复用db对象, 可以在最后使用 db.LastSql() 获取最后执行的sql // 如果不复用 db, 而是直接使用 DB(), 则会新建一个orm对象, 每一次都是全新的对象 // 所以复用 db, 一定要在当前会话周期内 db := DB() // 查询一条 var u Users // 查询数据并绑定到 user{} 上 err = db.Table(&u).Fields("uid,name,age").Where("age",">",0).OrderBy("uid desc").Select() if err!=nil { fmt.Println(err) } fmt.Println(u, u.Name) fmt.Println(db.LastSql()) // 查询多条 // 查询数据并绑定到 []Users 上, 这里复用了 db 及上下文条件参数 // 如果不想复用,则可以使用DB()就会开启全新会话,或者使用db.Reset() // db.Reset()只会清除上下文参数干扰,不会更换链接,DB()则会更换链接 var u2 []Users err = db.Limit(10).Offset(1).Select() fmt.Println(u2) // 统计数据 var count int64 // 这里reset清除上边查询的参数干扰, 可以统计所有数据, 如果不清楚, 则条件为上边查询的条件 // 同时, 可以新调用 DB(), 也不会产生干扰 count,err = db.Reset().Count() // 或 count, err = DB().Table(&u).Count() fmt.Println(count, err)} 高级用法
升级日志
升级指南从2.0.x升级到2.1.x
从1.x升级到2.x, 全新安装赞助渠道
![]() |
请发表评论