麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > Golang中的ORM框架評(píng)測(cè)及性能分析

Golang中的ORM框架評(píng)測(cè)及性能分析

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-12-27 09:57:36 1703642256

Golang中的ORM框架評(píng)測(cè)及性能分析

ORM是對(duì)象關(guān)系映射(Object-Relational Mapping)的縮寫,是一種通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將面向?qū)ο笳Z(yǔ)言程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中的技術(shù)。在Golang中,ORM框架也是非常重要的,因?yàn)樗梢詭椭覀兒?jiǎn)化數(shù)據(jù)庫(kù)操作的復(fù)雜度,提高開(kāi)發(fā)效率。本文將會(huì)對(duì)Golang中的ORM框架進(jìn)行評(píng)測(cè)及性能分析,以便讀者能夠選擇適合自己的ORM框架。

1. GORM

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

下面是一個(gè)使用GORM操作MySQL的簡(jiǎn)單例子:

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)

}

// 自動(dòng)遷移模式

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支持鏈?zhǔn)秸{(diào)用,使得查詢、排序、分頁(yè)等操作非常方便,例如:`go// 查詢所有年齡大于18歲的用戶db.Where("age > ?", 18).Find(&users)// 查詢前10條記錄db.Limit(10).Find(&users)// 查詢跳過(guò)前5條記錄后的10條記錄db.Offset(5).Limit(10).Find(&users)// 按照年齡降序排序db.Order("age desc").Find(&users)

GORM的缺點(diǎn)是,它的性能相對(duì)較差,不適合對(duì)大批量的數(shù)據(jù)進(jìn)行操作,因此在某些場(chǎng)景下,需要使用更加高效的ORM框架。

2. XORM

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

下面是一個(gè)使用XORM操作MySQL的簡(jiǎn)單例子:

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)

}

// 自動(dòng)同步數(shù)據(jù)表結(jié)構(gòu)

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支持批量插入、批量更新和批量刪除,對(duì)于批量操作的性能表現(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{})

總的來(lái)說(shuō),XORM是一個(gè)非常出色的Golang ORM框架,特別適合對(duì)大批量數(shù)據(jù)進(jìn)行操作。

3. GORP

GORP是另一個(gè)Golang ORM框架,封裝了一些常見(jiàn)的數(shù)據(jù)庫(kù)操作,如查詢、插入、更新和刪除,同時(shí)也支持多個(gè)數(shù)據(jù)庫(kù)。

下面是一個(gè)使用GORP操作MySQL的簡(jiǎn)單例子:

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

// 自動(dòng)同步數(shù)據(jù)表結(jié)構(gòu)

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來(lái)定義映射關(guān)系,在這個(gè)方面略顯不太便利,與GORM和XORM都不太一樣。不過(guò),GORP的性能表現(xiàn)可以與XORM相媲美,適合對(duì)大批量數(shù)據(jù)進(jìn)行操作。4. 性能分析為了評(píng)測(cè)各個(gè)ORM框架的性能表現(xiàn),我們編寫了一個(gè)基準(zhǔn)測(cè)試程序,分別測(cè)試了它們的插入、查詢、更新和刪除操作。`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 < 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)        }    }}

我們?cè)诒镜豈ySQL數(shù)據(jù)庫(kù)上運(yùn)行測(cè)試程序,測(cè)試結(jié)果如下:

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

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

| GORM | 7105 | 14325 | 11016 | 10507 |

| XORM | 10988 | 23717 | 22716 | 22716 |

| Gorp | 10001 | 16908 | 16011 | 16011 |

從測(cè)試結(jié)果可以看出,XORM的性能表現(xiàn)最好,在插入、查詢、更新和刪除操作中,都比其他兩個(gè)ORM框架快。GORM

以上就是IT培訓(xùn)機(jī)構(gòu)千鋒教育提供的相關(guān)內(nèi)容,如果您有web前端培訓(xùn),鴻蒙開(kāi)發(fā)培訓(xùn)python培訓(xùn),linux培訓(xùn),java培訓(xùn),UI設(shè)計(jì)培訓(xùn)等需求,歡迎隨時(shí)聯(lián)系千鋒教育。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
Golang中的函數(shù)式編程享受編程的樂(lè)趣

Golang中的函數(shù)式編程:享受編程的樂(lè)趣隨著程序開(kāi)發(fā)的不斷發(fā)展和進(jìn)步,越來(lái)越多的程序員開(kāi)始關(guān)注函數(shù)式編程。函數(shù)式編程可以讓代碼更簡(jiǎn)單、易讀...詳情>>

2023-12-27 11:13:15
Golang中的JSON處理從解析到生成

Golang中的JSON處理:從解析到生成在Golang中,處理JSON數(shù)據(jù)是非常常見(jiàn)的任務(wù)。JSON已經(jīng)成為了互聯(lián)網(wǎng)應(yīng)用程序中常用的數(shù)據(jù)交換格式。因此,對(duì)于...詳情>>

2023-12-27 11:11:30
Golang調(diào)優(yōu)的10個(gè)技巧提升應(yīng)用性能

Golang調(diào)優(yōu)的10個(gè)技巧:提升應(yīng)用性能Golang是一種高性能的編程語(yǔ)言,它的高效和優(yōu)秀的并發(fā)機(jī)制讓人眼前一亮,但是仍然需要注意應(yīng)用的性能問(wèn)題。...詳情>>

2023-12-27 10:46:52
如何通過(guò)Golang實(shí)現(xiàn)高性能的網(wǎng)絡(luò)編程

如何通過(guò) Golang 實(shí)現(xiàn)高性能的網(wǎng)絡(luò)編程Golang 是一門非常適合進(jìn)行高性能網(wǎng)絡(luò)編程的語(yǔ)言,它內(nèi)置了 goroutine 和 channel 兩個(gè)非常重要的特性,...詳情>>

2023-12-27 10:45:06
Golang中的機(jī)器學(xué)習(xí)用代碼實(shí)現(xiàn)智能化

Golang中的機(jī)器學(xué)習(xí):用代碼實(shí)現(xiàn)智能化機(jī)器學(xué)習(xí)是當(dāng)前最熱門的技術(shù)之一,它能夠利用算法和統(tǒng)計(jì)模型來(lái)讓機(jī)器從數(shù)據(jù)中學(xué)習(xí)并改善自己的能力。Gola...詳情>>

2023-12-27 10:39:50
快速通道
主站蜘蛛池模板: swag合集120部| 天天摸天天摸色综合舒服网| 日本一道本| 日本成人在线免费| 日韩欧美高清在线| 日本电影娼年| 女神捕电影高清在线观看| 樱桃视频高清免费观看在线播放| 国产卡一卡二卡三卡四| 波多野结衣1048系列电影| 日本一道高清一区二区三区| 日本三级在线| 国产成人精品久久综合| 亚洲痴女| 特区爱奴在线观看| 无套影院| 日本漫画之无翼彩漫大全| 亚洲国产婷婷综合在线精品| 91青青草视频在线观看| 蜜桃成熟时2005| 全彩里番acg里番本子| 免费大香伊蕉在人线国产| 一本久久a久久精品vr综合| 精品国产三级在线观看| 啊轻点灬大ji巴太粗太长了欧美| 亚洲欧美国产另类视频| j8又粗又长又硬又爽免费视频| aaa一级特黄| 美国式的禁忌19| 免费观看a级毛片| 久久综合九色综合网站| 天天草b| 午夜羞羞影院| 欧洲vodafonewifi14| 青娱乐国产盛宴| 亚洲国产欧美国产综合一区| 伊人色综合久久天天网| 国产精品爽爽va在线观看网站| 爽爽日本在线视频免费| 国产精品99| 女人张腿让男人捅|