golang orm對比

各主流的golang orm介紹

當前較爲主流/活躍的orm有gorm、xorm、gorose等html

xorm

  • 文檔mysql

  • 支持的數據庫有:mysql、mymysql、postgres、tidb、sqlite、mssql、oracle
  • 事務性支持
  • 鏈式apigit

    has, err := engine.Where("name = ?", name).Desc("id").Get(&user)
    err := engine.Where(builder.NotIn("a", 1, 2).And(builder.In("b", "c", "d", "e"))).Find(&users)
  • 支持原生sql操做
  • 查詢緩存
  • 可根據數據庫反轉生成代碼
  • 級聯加載
  • 提供sql語句日誌輸出
  • 支持批量查詢處理github

    // 每次處理100條
    // SELECT * FROM user Limit 0, 100
    // SELECT * FROM user Limit 101, 100
    err := engine.BufferSize(100).Iterate(&User{Name:name}, func(idx int, bean interface{}) error {
        user := bean.(*User)
        return nil
    })
  • 自動化的讀寫分離/主從式
dataSourceNameSlice := []string{masterDataSourceName, slave1DataSourceName, slave2DataSourceName}
engineGroup, err := xorm.NewEngineGroup(driverName, dataSourceNameSlice)

gorm

  • 文檔golang

  • hook機制(Before/After Create/Save/Update/Delete/Find)
  • 對象關係Has One, Has Many, Belongs To, Many To Many, Polymorphism
  • 熱加載
  • 支持原生sql操做
  • 事務性
  • 鏈式apisql

    tx := db.Where("name = ?", "jinzhu").Where("age = ?", 20).Find(&users)
  • 支持的數據庫有:mysql、postgre、sqlite、sqlserver
  • 查詢操做數據庫

    // Get first record, order by primary key
    db.First(&user)
    //// SELECT * FROM users ORDER BY id LIMIT 1;
    
    // plain sql
    db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
    // map
    db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
    //// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;

gorose

  • 文檔api

  • 支持的數據庫有:mysql、postgres、sqlite、mssql、oracle
  • 鏈式api
  • 同時鏈接多個數據庫和切換
  • 支持原生sql操做
  • 支持批量查詢處理
  • 事務性緩存

    User.Fields("id, name").Where("id",">",2).Chunk(2, func(data []map[string]interface{}) {
        // for _,item := range data {
        //     fmt.Println(item)
        // }
        fmt.Println(data)
    })

upper/db

同時支持nosql和sql的orm很少,這是其中之一 (另外一個是beedb,已經四年沒有更新了). upper/db對多種數據庫進行封裝,提供統一的接口進行CRUD.oracle

  • 文檔

  • 支持的數據庫有:PostgreSQL, MySQL, SQLite, MSSQL, QL and MongoDB.
  • 不支持根據數據庫類生成數據庫表等DCL操做,只有DQL,DML
  • 與大部分orm 框架相同,提供鏈接池
  • 對RDBMS支持事務性
sess, err := postgresql.Open(settings)
if err != nil {
    log.Fatalf("db.Open(): %q\n", err)
}
defer sess.Close()

var books []Book
err = sess.Collection("books").Find().All(&books)

總結

  • 類似性

    • 各orm支持的數據庫都基本相同(主流數據庫都支持)
    • 支持事務性、鏈式查詢等
  • 差別

    • xorm、gorose支持批量查詢處理
    • xorm支持主從式讀寫分離
    • gorm支持熱加載
    • gorose便於在多個數據庫切換
    • 文檔全面性gorm>xorm>gorose
相關文章
相關標籤/搜索