go語言orm之gorose全新版本2.0低調發布

號稱go語言版本的laravel's eloquent, 發佈了久違了2.0版本, 新版本作了很大的改進和升級, 下面咱們一塊兒來看一下新版本的特性.php

架構調整

gorose 2.0版本作了完全的重構, 擁有全新的架構. 架構如圖:
gorose-2.0-designpython

gorose 2.0 採用模塊化架構, 經過interface的api通訊,嚴格的上層依賴下層.每個模塊均可以拆卸, 甚至能夠自定義爲本身喜歡的樣子.mysql

  • 主模塊laravel

    • engin
      gorose 初始化配置模塊, 能夠全局保存並複用
    • session
      真正操做數據庫底層模塊, 全部的操做, 最終都會走到這裏來獲取或修改數據
    • orm
      對象關係映射模塊, 全部的orm操做, 都在這裏完成
    • builder
      構建終極執行的sql模塊, 能夠構建任何數據庫的sql, 但要符合database/sql包的接口
  • 子模塊git

    • driver
      數據庫驅動模塊, 被engin和builder依賴, 根據驅動來搞事情
    • binder
      結果集綁定模塊, 全部的返回結果集都在這裏

其餘語言入手姿式

  1. php: 使用過laravel的orm就能夠快速上手使用
  2. python: 使用過orator orm的用戶,能夠快速上手
  3. 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...github

特點

  • 鏈接池
  • 鏈式調用
  • 支持傳入struct,map或字符串表名
  • 讀寫分離集羣支持
  • 海量數據自動分塊處理
  • 一鍵開啓事務,自動回滾和提交
  • 模塊化架構,自由擴展

官方文檔

最新版2.x文檔sql

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

實戰代碼api

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 ruby

官方qq羣: 470809220,點擊加入

相關文章
相關標籤/搜索