天天看點

go語言orm之gorose全新版本2.0低調釋出

文章目錄

    • 架構調整
    • 其他語言入手姿勢
    • 支援驅動
    • 特色
    • 官方文檔
    • api預覽
    • 最佳實踐
    • 官方網站

号稱go語言版本的laravel’s eloquent, 釋出了久違了2.0版本, 新版本做了很大的改進和更新, 下面我們一起來看一下新版本的特性.

架構調整

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

go語言orm之gorose全新版本2.0低調釋出

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

  • 主子產品
    • engin

      gorose 初始化配置子產品, 可以全局儲存并複用

    • session

      真正操作資料庫底層子產品, 所有的操作, 最終都會走到這裡來擷取或修改資料

    • orm

      對象關系映射子產品, 所有的orm操作, 都在這裡完成

    • builder

      建構終極執行的sql子產品, 可以建構任何資料庫的sql, 但要符合

      database/sql

      包的接口
  • 子子產品
    • driver

      資料庫驅動子產品, 被engin和builder依賴, 根據驅動來搞事情

    • binder

      結果集綁定子產品, 所有的傳回結果集都在這裡

其他語言入手姿勢

  1. php: 使用過

    laravel

    的orm就可以快速上手使用
  2. python: 使用過

    orator orm

    的使用者,可以快速上手
  3. ruby: 使用過

    rails

    的orm就可以快速上手

支援驅動

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,點選加入