各主流的golang orm介紹
當前較為主流/活躍的orm有gorm、xorm、gorose等
xorm
文檔
- 支援的資料庫有:mysql、mymysql、postgres、tidb、sqlite、mssql、oracle
- 事務性支援
鏈式api
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語句日誌輸出
支援批量查詢處理
// 每次處理100條// SELECT * FROM user Limit 0, 100// SELECT * FROM user Limit 101, 100err := 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
文檔
- hook機制(Before/After Create/Save/Update/Delete/Find)
- 對象關係Has One, Has Many, Belongs To, Many To Many, Polymorphism
- 熱載入
- 支援原生sql操作
- 事務性
鏈式api
tx := db.Where("name = ?", "jinzhu").Where("age = ?", 20).Find(&users)
- 支援的資料庫有:mysql、postgre、sqlite、sqlserver
查詢操作
// Get first record, order by primary keydb.First(&user)//// SELECT * FROM users ORDER BY id LIMIT 1;// plain sqldb.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)// mapdb.Where(&User{Name: "jinzhu", Age: 20}).First(&user)//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;
gorose
文檔
- 支援的資料庫有: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.
文檔
- 支援的資料庫有: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 []Bookerr = sess.Collection("books").Find().All(&books)
總結
相似性
- 各orm支援的資料庫都基本相同(主流資料庫都支援)
- 支援事務性、鏈式查詢等
差異
- xorm、gorose支援批量查詢處理
- xorm支援主從式讀寫分離
- gorm支援熱載入
- gorose便於在多個資料庫切換
- 文檔全面性gorm>xorm>gorose