文章目錄
-
- 架構調整
- 其他語言入手姿勢
- 支援驅動
- 特色
- 官方文檔
- api預覽
- 最佳實踐
- 官方網站
号稱go語言版本的laravel’s eloquent, 釋出了久違了2.0版本, 新版本做了很大的改進和更新, 下面我們一起來看一下新版本的特性.
架構調整
gorose 2.0版本做了徹底的重構, 擁有全新的架構. 架構如圖:
gorose 2.0 采用子產品化架構, 通過interface的api通信,嚴格的上層依賴下層.每一個子產品都可以拆卸, 甚至可以自定義為自己喜歡的樣子.
- 主子產品
-
engin
gorose 初始化配置子產品, 可以全局儲存并複用
-
session
真正操作資料庫底層子產品, 所有的操作, 最終都會走到這裡來擷取或修改資料
-
orm
對象關系映射子產品, 所有的orm操作, 都在這裡完成
-
builder
建構終極執行的sql子產品, 可以建構任何資料庫的sql, 但要符合
包的接口database/sql
-
- 子子產品
-
driver
資料庫驅動子產品, 被engin和builder依賴, 根據驅動來搞事情
-
binder
結果集綁定子產品, 所有的傳回結果集都在這裡
-
其他語言入手姿勢
- php: 使用過
的orm就可以快速上手使用laravel
- python: 使用過
的使用者,可以快速上手orator orm
- ruby: 使用過
的orm就可以快速上手rails
支援驅動
mysql : https://github.com/go-sql-driver/mysql
sqlite3 : https://github.com/mattn/go-sqlite3
postgres : https://github.com/lib/pq
oracle : https://github.com/mattn/go-oci8
mssql : https://github.com/denisenkom/go-mssqldb
clickhouse : https://github.com/kshvakov/clickhouse
特色
- 連接配接池
- 鍊式調用
- 支援傳入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,點選加入