共计 2376 个字符,预计需要花费 6 分钟才能阅读完成。
号称 go 语言版本的 laravel’s eloquent, 发布了久违了 2.0 版本, 新版本做了很大的改进和升级, 下面我们一起来看一下新版本的特性.
架构调整
gorose 2.0 版本做了彻底的重构, 拥有全新的架构. 架构如图:
gorose 2.0 采用模块化架构, 通过 interface 的 api 通信, 严格的上层依赖下层. 每一个模块都可以拆卸, 甚至可以自定义为自己喜欢的样子.
-
主模块
- engin
gorose 初始化配置模块, 可以全局保存并复用 - session
真正操作数据库底层模块, 所有的操作, 最终都会走到这里来获取或修改数据 - orm
对象关系映射模块, 所有的 orm 操作, 都在这里完成 - builder
构建终极执行的 sql 模块, 可以构建任何数据库的 sql, 但要符合database/sql
包的接口
- engin
-
子模块
- driver
数据库驱动模块, 被 engin 和 builder 依赖, 根据驱动来搞事情 - binder
结果集绑定模块, 所有的返回结果集都在这里
- driver
其他语言入手姿势
- php: 使用过
laravel
的 orm 就可以快速上手使用 - python: 使用过
orator orm
的用户, 可以快速上手 - ruby: 使用过
rails
的 orm 就可以快速上手
支持驱动
mysql : https://github.com/go-sql-dri…
sqlite3 : https://github.com/mattn/go-s…
postgres : https://github.com/lib/pq
oracle : https://github.com/mattn/go-oci8
mssql : https://github.com/denisenkom…
clickhouse : https://github.com/kshvakov/c…
特色
- 连接池
- 链式调用
- 支持传入 struct,map 或字符串表名
- 读写分离集群支持
- 海量数据自动分块处理
- 一键开启事务, 自动回滚和提交
- 模块化架构, 自由扩展
官方文档
最新版 2.x 文档
api 预览
db.Table().Fields().Where().GroupBy().Having().OrderBy.Limit().Select()
db.Table().Data().Insert()
db.Table().Data().Where().Update()
db.Table().Where().Delete()
最佳实践
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 main
import (
"fmt"
"github.com/gohouse/gorose"
_ "github.com/mattn/go-sqlite3"
)
type Users struct {
Uid int64 `gorose:"uid"`
Name string `gorose:"name"`
Age int64 `gorose:"age"`
Xxx interface{} `gorose:"ignore"` // 这个字段在 orm 中会忽略}
func (u *Users) TableName() string {return "users"}
var err error
var engin *gorose.Engin
func 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()
// 这里的对象是 map, 所以需要初始化(var u = user{}), 不能像 struct 那样, 可以直接 `var u Users`
var u = Users{}
var count int64
// 统计数据
count,err = db.Table(&u).Fields("uid,name,age").Where("age",">",0).OrderBy("uid desc").Limit(10).Offset(1).Count()
if err!=nil {fmt.Println(err)
}
// 查询数据并绑定到 user{} 上, 这里复用了 db 及上下文条件参数
// 如果不想复用, 则可以使用 DB()就会开启全新会话, 或者使用 db.Reset()
// db.Reset()只会清除上下文参数干扰, 不回更换链接,DB()则会更换链接
err = db.Select()
fmt.Println(count)
fmt.Println(u, u.Name.String())
fmt.Println(db.LastSql())
}
官方网站
https://github.com/gohouse/gorose
官方 qq 群: 470809220, 点击加入
正文完