中文字幕av高清_国产视频一二区_男女羞羞羞视频午夜视频_成人精品一区_欧美色视_在线视频这里只有精品

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Golang中的ORM框架評測及性能分析

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

來源:千鋒教育
發布人:xqq
時間: 2023-12-27 09:57:36 1703642256

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

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

1. GORM

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

下面是一個使用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{})

// 創建記錄

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的缺點是,它的性能相對較差,不適合對大批量的數據進行操作,因此在某些場景下,需要使用更加高效的ORM框架。

2. XORM

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

下面是一個使用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)

}

// 自動同步數據表結構

err = engine.Sync2(&User{})

if err != nil {

panic(err)

}

// 插入數據

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)

}

// 查詢數據

users := make(User, 0)

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

if err != nil {

panic(err)

}

// 更新數據

user := users

user.Age = 21

_, err = engine.Update(&user)

if err != nil {

panic(err)

}

// 刪除數據

_, err = engine.Delete(&user)

if err != nil {

panic(err)

}

}

XORM支持批量插入、批量更新和批量刪除,對于批量操作的性能表現非常出色。例如:`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框架,特別適合對大批量數據進行操作。

3. GORP

GORP是另一個Golang ORM框架,封裝了一些常見的數據庫操作,如查詢、插入、更新和刪除,同時也支持多個數據庫。

下面是一個使用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)

}

// 創建ORM映射

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

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

// 自動同步數據表結構

err = dbmap.CreateTablesIfNotExists()

if err != nil {

panic(err)

}

// 插入數據

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

err = dbmap.Insert(user)

if err != nil {

panic(err)

}

// 查詢數據

users := make(User, 0)

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

if err != nil {

panic(err)

}

// 更新數據

user.Age = 19

_, err = dbmap.Update(user)

if err != nil {

panic(err)

}

// 刪除數據

_, err = dbmap.Delete(user)

if err != nil {

panic(err)

}

}

GORP使用struct tag來定義映射關系,在這個方面略顯不太便利,與GORM和XORM都不太一樣。不過,GORP的性能表現可以與XORM相媲美,適合對大批量數據進行操作。4. 性能分析為了評測各個ORM框架的性能表現,我們編寫了一個基準測試程序,分別測試了它們的插入、查詢、更新和刪除操作。`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)        }    }}

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

| 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的性能表現最好,在插入、查詢、更新和刪除操作中,都比其他兩個ORM框架快。GORM

以上就是IT培訓機構千鋒教育提供的相關內容,如果您有web前端培訓,鴻蒙開發培訓,python培訓,linux培訓,java培訓,UI設計培訓等需求,歡迎隨時聯系千鋒教育。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 国产精品美女久久久久久免费 | 久久精品国产一区 | 中文字幕 国产 | 激情六月综合 | 高清视频一区二区 | 亚洲性图视频 | 国产精品中文字幕一区二区三区 | 久久亚洲美女视频 | 麻豆精品久久久 | 国产精品一区二区三区免费 | 日本一区二区三区四区视频 | 亚洲视频一区二区三区 | 在线观看黄av| 91在线一区二区 | 日日夜夜爽 | 久久久久久久久久久网站 | 国产精品久久久99 | 一区二区精品 | 伊人青青久久 | 天天草天天插 | 亚洲视频在线观看网址 | 91av国产视频 | 亚洲欧美一区二区三区在线 | 欧美一区二区三区在线看 | 久久99国产精品久久99大师 | 国产精品久久久久影院 | 4hu影视 | 资源av| 国产激情在线 | 久久久免费 | 黄色一级片视频 | 欧美亚洲日本国产 | 尤物久久av一区二区三区亚洲 | 国产美女在线精品免费 | www.久久久久 | 国产精品中文 | 午夜电影网站 | 国产亚洲一区二区三区在线观看 | 一区二区国产精品 | 欧美一二三区在线观看 | 久久精品 |