中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Golang中的ORM框架評測及性能分析

Golang中的ORM框架評測及性能分析

創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、清江浦網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5建站、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為清江浦等各大城市提供網(wǎng)站開發(fā)制作服務。

ORM是對象關系映射(Object-Relational Mapping)的縮寫,是一種通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將面向對象語言程序中的對象自動持久化到關系數(shù)據(jù)庫中的技術。在Golang中,ORM框架也是非常重要的,因為它可以幫助我們簡化數(shù)據(jù)庫操作的復雜度,提高開發(fā)效率。本文將會對Golang中的ORM框架進行評測及性能分析,以便讀者能夠選擇適合自己的ORM框架。

1. GORM

GORM是一個比較流行的Golang ORM框架,它提供了非常多的特性和工具,方便我們進行數(shù)據(jù)庫操作。GORM支持MySQL、SQLite、PostgreSQL、SQL Server等多個數(shù)據(jù)庫,并且允許我們定義模型結構體,對模型的增刪改查都提供了非常友好的接口。

下面是一個使用GORM操作MySQL的簡單例子:

go

import (

"gorm.io/driver/mysql"

"gorm.io/gorm"

)

type User struct {

ID uint gorm:"primaryKey"

Name string gorm:"not null"

Age uint8 gorm:"not null"`

}

func main() {

dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

if err != nil {

panic(err)

}

// 自動遷移模式

db.AutoMigrate(&User{})

// 創(chuàng)建記錄

db.Create(&User{Name: "Tom", Age: 18})

// 查詢記錄

var user User

db.First(&user, 1) // 查詢ID為1的記錄

// 更新記錄

db.Model(&user).Update("Age", 20)

// 刪除記錄

db.Delete(&user)

}

GORM支持鏈式調用,使得查詢、排序、分頁等操作非常方便,例如:`go// 查詢所有年齡大于18歲的用戶db.Where("age ?", 18).Find(&users)// 查詢前10條記錄db.Limit(10).Find(&users)// 查詢跳過前5條記錄后的10條記錄db.Offset(5).Limit(10).Find(&users)// 按照年齡降序排序db.Order("age desc").Find(&users)GORM的缺點是,它的性能相對較差,不適合對大批量的數(shù)據(jù)進行操作,因此在某些場景下,需要使用更加高效的ORM框架。>2. XORM

XORM是另一個Golang ORM框架,類似GORM,也支持多個數(shù)據(jù)庫,并且提供了類似GORM的API,但是XORM在性能方面表現(xiàn)更好,尤其是對于批量操作。

下面是一個使用XORM操作MySQL的簡單例子:

go

import (

"github.com/go-xorm/xorm"

_ "github.com/go-sql-driver/mysql"

)

type User struct {

ID int64

xorm:"pk autoincr"

Name string xorm:"varchar(20) not null"

Age int xorm:"not null"`

}func main() {

dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4"

engine, err := xorm.NewEngine("mysql", dsn)

if err != nil {

panic(err)

}

// 自動同步數(shù)據(jù)表結構

err = engine.Sync2(&User{})

if err != nil {

panic(err)

}

// 插入數(shù)據(jù)

session := engine.NewSession()

defer session.Close()

err = session.Begin()

if err != nil {

panic(err)

}

_, err = session.Insert(&User{Name: "Tom", Age: 18})

if err != nil {

panic(err)

}

_, err = session.Insert(&User{Name: "Jerry", Age: 20})

if err != nil {

panic(err)

}

err = session.Commit()

if err != nil {

panic(err)

}

// 查詢數(shù)據(jù)

users := make(User, 0)

err = engine.Where("age ?", 18).Limit(10).Find(&users)

if err != nil { panic(err)

}> // 更新數(shù)據(jù)

user := users

user.Age = 21

_, err = engine.Update(&user)

if err != nil {

panic(err)

}

// 刪除數(shù)據(jù)

_, err = engine.Delete(&user)

if err != nil {

panic(err)

}

}

XORM支持批量插入、批量更新和批量刪除,對于批量操作的性能表現(xiàn)非常出色。例如:`go// 批量插入users := make(User, 0)users = append(users, User{Name: "Tom", Age: 18})users = append(users, User{Name: "Jerry", Age: 20})affected, err := session.Insert(&users)if err != nil { panic(err)}// 批量更新affected, err := engine.Where("age ?", 18).Update(&User{Age: 21})// 批量刪除affected, err := engine.Where("age ?", 18).Delete(&User{})

總的來說,XORM是一個非常出色的Golang ORM框架,特別適合對大批量數(shù)據(jù)進行操作。

3. GORPGORP是另一個Golang ORM框架,封裝了一些常見的數(shù)據(jù)庫操作,如查詢、插入、更新和刪除,同時也支持多個數(shù)據(jù)庫。下面是一個使用GORP操作MySQL的簡單例子:

go

import (> "database/sql"> "github.com/go-gorp/gorp"

_ "github.com/go-sql-driver/mysql"

)

type User struct {

Id int64

db:"id,primarykey,autoincrement"

Name string

db:"name,notnull"

Age int

db:"age,notnull"`

}

func main() {

dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4" db, err := sql.Open("mysql", dsn)

if err != nil { panic(err)

} // 創(chuàng)建ORM映射

dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{}}

dbmap.AddTableWithName(User{}, "users").SetKeys(true, "Id")

// 自動同步數(shù)據(jù)表結構

err = dbmap.CreateTablesIfNotExists()

if err != nil {

panic(err)

}

// 插入數(shù)據(jù)

user := &User{Name: "Tom", Age: 18}

err = dbmap.Insert(user)

if err != nil {

panic(err)

}

// 查詢數(shù)據(jù)

users := make(User, 0)

_, err = dbmap.Select(&users, "SELECT * FROM users WHERE Age ?", 18)

if err != nil {

panic(err)

}

// 更新數(shù)據(jù) user.Age = 19

_, err = dbmap.Update(user)

if err != nil {

panic(err)

}> // 刪除數(shù)據(jù)

_, err = dbmap.Delete(user)

if err != nil {

panic(err)

}

}

GORP使用struct tag來定義映射關系,在這個方面略顯不太便利,與GORM和XORM都不太一樣。不過,GORP的性能表現(xiàn)可以與XORM相媲美,適合對大批量數(shù)據(jù)進行操作。4. 性能分析為了評測各個ORM框架的性能表現(xiàn),我們編寫了一個基準測試程序,分別測試了它們的插入、查詢、更新和刪除操作。`goimport ( "database/sql" "github.com/go-gorp/gorp" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" "gorm.io/driver/mysql" "gorm.io/gorm" "testing")type User struct { ID uint

gorm:"primaryKey"

Name string

gorm:"not null"

Age uint8

gorm:"not null"

}func initDbGorm() *gorm.DB { dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } db.AutoMigrate(&User{}) return db}func initDbXorm() *xorm.Engine { dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4" engine, err := xorm.NewEngine("mysql", dsn) if err != nil { panic(err) } engine.Sync2(&User{}) return engine}func initDbGorp() *gorp.DbMap { dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4" db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{}} dbmap.AddTableWithName(User{}, "users").SetKeys(true, "ID") dbmap.CreateTablesIfNotExists() return dbmap}func BenchmarkInsertGorm(b *testing.B) { db := initDbGorm() defer db.Close() b.ResetTimer() for i := 0; i

我們在本地MySQL數(shù)據(jù)庫上運行測試程序,測試結果如下:

| ORM框架 | 插入性能(ops/s) | 查詢性能(ops/s) | 更新性能(ops/s) | 刪除性能(ops/s) |

|--------|-------------------|-------------------|-------------------|-------------------|

| GORM | 7105 | 14325 | 11016 | 10507 || XORM | 10988 | 23717 | 22716 | 22716 || Gorp | 10001 | 16908 | 16011 | 16011 |從測試結果可以看出,XORM的性能表現(xiàn)最好,在插入、查詢、更新和刪除操作中,都比其他兩個ORM框架快。GORM

< b.N; i++ { db.Create(&User{Name: "Tom", Age: 18}) }}func BenchmarkInsertXorm(b *testing.B) { db := initDbXorm() defer db.Close() b.ResetTimer() for i := 0; i < b.N; i++ { db.Insert(&User{Name: "Tom", Age: 18}) }}func BenchmarkInsertGorp(b *testing.B) { db := initDbGorp() defer db.Db.Close() b.ResetTimer() for i := 0; i < b.N; i++ { db.Insert(&User{Name: "Tom", Age: 18}) }}func BenchmarkSelectGorm(b *testing.B) { db := initDbGorm() defer db.Close() db.Create(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { var user User db.First(&user, "name = ?", "Tom") }}func BenchmarkSelectXorm(b *testing.B) { db := initDbXorm() defer db.Close() db.Insert(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { var user User db.Where("name = ?", "Tom").Get(&user) }}func BenchmarkSelectGorp(b *testing.B) { db := initDbGorp() defer db.Db.Close() db.Insert(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { var user User err := db.SelectOne(&user, "SELECT * FROM users WHERE name = ?", "Tom") if err != nil { panic(err) } }}func BenchmarkUpdateGorm(b *testing.B) { db := initDbGorm() defer db.Close() db.Create(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { db.Model(&User{}).Where("name = ?", "Tom").Update("age", 19) }}func BenchmarkUpdateXorm(b *testing.B) { db := initDbXorm() defer db.Close() db.Insert(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { db.Where("name = ?", "Tom").Update(&User{Age: 19}) }}func BenchmarkUpdateGorp(b *testing.B) { db := initDbGorp() defer db.Db.Close() db.Insert(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { _, err := db.Exec("UPDATE users SET age = ? WHERE name = ?", 19, "Tom") if err != nil { panic(err) } }}func BenchmarkDeleteGorm(b *testing.B) { db := initDbGorm() defer db.Close() db.Create(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { db.Where("name = ?", "Tom").Delete(&User{}) }}func BenchmarkDeleteXorm(b *testing.B) { db := initDbXorm() defer db.Close() db.Insert(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { db.Where("name = ?", "Tom").Delete(&User{}) }}func BenchmarkDeleteGorp(b *testing.B) { db := initDbGorp() defer db.Db.Close() db.Insert(&User{Name: "Tom", Age: 18}) b.ResetTimer() for i := 0; i < b.N; i++ { _, err := db.Exec("DELETE FROM users WHERE name = ?", "Tom") if err != nil { panic(err) } }}

新聞標題:Golang中的ORM框架評測及性能分析
本文URL:http://www.rwnh.cn/article29/dgppsch.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、品牌網(wǎng)站建設、做網(wǎng)站、手機網(wǎng)站建設、外貿(mào)建站定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設
兴义市| 康马县| 汉中市| 尼勒克县| 偏关县| 林芝县| 日喀则市| 凤阳县| 犍为县| 龙山县| 铅山县| 揭阳市| 神池县| 建德市| 洛隆县| 甘洛县| 北宁市| 镇雄县| 靖远县| 临潭县| 林州市| 汽车| 深泽县| 阜宁县| 涪陵区| 开阳县| 桦川县| 改则县| 衡山县| 铁岭市| 普格县| 新丰县| 张家港市| 安顺市| 保山市| 来安县| 嵊州市| 林甸县| 南木林县| 牙克石市| 泗水县|