go語言orm之gorose全新版本2.0低調(diào)發(fā)布

號稱go語言版本的laravel's eloquent, 發(fā)布了久違了2.0版本, 新版本做了很大的改進和升級, 下面我們一起來看一下新版本的特性.

架構(gòu)調(diào)整

gorose 2.0版本做了徹底的重構(gòu), 擁有全新的架構(gòu). 架構(gòu)如圖:

image

gorose 2.0 采用模塊化架構(gòu), 通過interface的api通信,嚴格的上層依賴下層.每一個模塊都可以拆卸, 甚至可以自定義為自己喜歡的樣子.

  • 主模塊
    • engin
      gorose 初始化配置模塊, 可以全局保存并復(fù)用
    • session
      真正操作數(shù)據(jù)庫底層模塊, 所有的操作, 最終都會走到這里來獲取或修改數(shù)據(jù)
    • orm
      對象關(guān)系映射模塊, 所有的orm操作, 都在這里完成
    • builder
      構(gòu)建終極執(zhí)行的sql模塊, 可以構(gòu)建任何數(shù)據(jù)庫的sql, 但要符合database/sql包的接口
  • 子模塊
    • driver
      數(shù)據(jù)庫驅(qū)動模塊, 被engin和builder依賴, 根據(jù)驅(qū)動來搞事情
    • binder
      結(jié)果集綁定模塊, 所有的返回結(jié)果集都在這里

其他語言入手姿勢

  1. php: 使用過laravel的orm就可以快速上手使用
  2. python: 使用過orator orm的用戶,可以快速上手
  3. ruby: 使用過rails的orm就可以快速上手

支持驅(qū)動

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

特色

  • 連接池
  • 鏈式調(diào)用
  • 支持傳入struct,map或字符串表名
  • 讀寫分離集群支持
  • 海量數(shù)據(jù)自動分塊處理
  • 一鍵開啟事務(wù),自動回滾和提交
  • 模塊化架構(gòu),自由擴展

官方文檔

最新版2.x文檔

api預(yù)覽

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);

實戰(zhàn)代碼

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() {
    // 全局初始化數(shù)據(jù)庫,并復(fù)用
    // 這里的engin需要全局保存,可以用全局變量,也可以用單例
    // 配置&gorose.Config{}是單一數(shù)據(jù)庫配置
    // 如果配置讀寫分離集群,則使用&gorose.ConfigCluster{}
    engin, err = gorose.Open(&gorose.Config{Driver: "sqlite3", Dsn: "./db.sqlite"})
}
func DB() gorose.IOrm {
    return engin.NewOrm()
}
func main() {
    // 這里定義一個變量db, 是為了復(fù)用db對象, 可以在最后使用 db.LastSql() 獲取最后執(zhí)行的sql
    // 如果不復(fù)用 db, 而是直接使用 DB(), 則會新建一個orm對象, 每一次都是全新的對象
    // 所以復(fù)用 db, 一定要在當前會話周期內(nèi)
    db := DB()
    // 這里的對象是map, 所以需要初始化(var u = user{}), 不能像struct那樣, 可以直接 `var u Users`
    var u = Users{}
    var count int64
    // 統(tǒng)計數(shù)據(jù)
    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)
    }
    // 查詢數(shù)據(jù)并綁定到 user{} 上, 這里復(fù)用了 db 及上下文條件參數(shù)
    // 如果不想復(fù)用,則可以使用DB()就會開啟全新會話,或者使用db.Reset()
    // db.Reset()只會清除上下文參數(shù)干擾,不回更換鏈接,DB()則會更換鏈接
    err = db.Select()
    
    fmt.Println(count)
    fmt.Println(u, u.Name.String())
    fmt.Println(db.LastSql())
}

官方網(wǎng)站

https://github.com/gohouse/gorose

官方qq群: 470809220,點擊加入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 3,124評論 1 3
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,550評論 0 85
  • 請允許我借鑒前輩們的東西~~~~ 感激不盡~~~~~ 以下為Android 框架排行榜 么么噠~ Android...
    嗯_新閱讀 2,518評論 3 32
  • 1. 分布式系統(tǒng)核心問題 參考書籍:《區(qū)塊鏈原理、設(shè)計與應(yīng)用》 一致性問題例子:兩個不同的電影院買同一種電影票,如...
    molscar閱讀 1,003評論 0 0
  • 切斯特頓在《回到正統(tǒng)》中講到殉道者和自殺者的區(qū)別:“殉道者太關(guān)心自身以外的事情,于是置個人的生命于不顧。自殺者太不...
    馬其頓的呼聲閱讀 742評論 0 0

友情鏈接更多精彩內(nèi)容