自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Golang的GORM vs. Ent對比,你更會用哪個?

開發(fā) 前端
Ent 是由 Facebook 開發(fā)的一個 Go ORM 庫,旨在提供強類型的、基于代碼生成的數(shù)據(jù)庫訪問。Ent 側(cè)重于代碼生成,借助代碼生成工具生成實體、查詢構(gòu)建器和數(shù)據(jù)庫遷移代碼,避免了手寫 SQL 或構(gòu)建復(fù)雜的查詢。

在 Go 語言的 ORM(Object-Relational Mapping)庫中,GORM 和 Ent 是兩個非常流行的選擇。它們都為 Go 提供了高效的數(shù)據(jù)庫操作和對象映射功能,但在設(shè)計理念、功能特點、使用方式以及性能方面有所不同。下面我們將通過對比兩者的特性,幫助你了解哪個框架更適合你的項目需求。

1. 概述

  • GORM

a.GORM 是一個流行的 Go ORM 庫,廣泛應(yīng)用于 Go 項目中。它的特點是易于使用和靈活,支持常見的數(shù)據(jù)庫操作,如創(chuàng)建、讀取、更新和刪除(CRUD),并且提供了豐富的功能,諸如關(guān)聯(lián)查詢、事務(wù)、自動遷移等。

b.GORM 采用基于結(jié)構(gòu)體的方式進行模型定義,并通過標(biāo)簽(tags)定義表結(jié)構(gòu)和字段。

  • Ent
  • Ent 是由 Facebook 開發(fā)的一個 Go ORM 庫,旨在提供強類型的、基于代碼生成的數(shù)據(jù)庫訪問。Ent 側(cè)重于代碼生成,借助代碼生成工具生成實體、查詢構(gòu)建器和數(shù)據(jù)庫遷移代碼,避免了手寫 SQL 或構(gòu)建復(fù)雜的查詢。
  • Ent 更加注重類型安全和高效的查詢構(gòu)建,適合大型項目和復(fù)雜數(shù)據(jù)庫架構(gòu)。

2. 主要差異

圖片

3. 代碼示例對比

3.1 GORM 示例

假設(shè)我們有一個簡單的 UserProfile 之間的一對一關(guān)系:

package main

import (
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"fmt"
)

type User struct {
	ID      uint
	Name    string
	Profile Profile
}

type Profile struct {
	ID     uint
	UserID uint
	Age    int
}

func main() {
	// 初始化數(shù)據(jù)庫連接
	db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 自動遷移
	db.AutoMigrate(&User{}, &Profile{})

	// 創(chuàng)建數(shù)據(jù)
	user := User{Name: "John", Profile: Profile{Age: 30}}
	db.Create(&user)

	// 查詢并關(guān)聯(lián)
	var result User
	db.Preload("Profile").First(&result, "name = ?", "John")
	fmt.Println(result)
}

特點:

  • 使用 gorm 標(biāo)簽自動映射數(shù)據(jù)庫表。
  • 使用 Preload 來加載關(guān)聯(lián)的 Profile 數(shù)據(jù)。
  • 自動遷移功能,快速構(gòu)建數(shù)據(jù)庫。

3.2 Ent 示例

假設(shè)我們有一個類似的 UserProfile 模型:

首先,定義 schema 文件(user.goprofile.go)。

ent/schema/user.go

package schema

import (
	"entgo.io/ent"
	"entgo.io/ent/schema/edge"
)

// User holds the schema definition for the User entity.
type User struct {
	ent.Schema
}

// Fields of the User.
func (User) Fields() []ent.Field {
	return []ent.Field{
		field.String("name").
			NotEmpty(),
	}
}

// Edges of the User.
func (User) Edges() []ent.Edge {
	return []ent.Edge{
		edge.To("profile", Profile.Type).
			Unique(),
	}
}

ent/schema/profile.go

package schema

import (
	"entgo.io/ent"
	"entgo.io/ent/schema/edge"
)

// Profile holds the schema definition for the Profile entity.
type Profile struct {
	ent.Schema
}

// Fields of the Profile.
func (Profile) Fields() []ent.Field {
	return []ent.Field{
		field.Int("age").
			Positive(),
	}
}

// Edges of the Profile.
func (Profile) Edges() []ent.Edge {
	return []ent.Edge{
		edge.From("user", User.Type).
			Ref("profile").
			Unique(),
	}
}

接下來,通過 ent 工具生成代碼:

go run entgo.io/ent/cmd/ent generate ./ent/schema

然后,你可以像下面這樣使用生成的代碼:

package main

import (
	"context"
	"fmt"
	"log"

	"entgo.io/ent/dialect/sql"
	_ "github.com/mattn/go-sqlite3"
	"myapp/ent"
)

func main() {
	client, err := ent.Open(sqlite.Open("ent.db"), &ent.Config{})
	if err != nil {
		log.Fatal("Failed to connect to database:", err)
	}
	defer client.Close()

	// 執(zhí)行遷移
	if err := client.Schema.Create(context.Background()); err != nil {
		log.Fatal("Failed to create schema:", err)
	}

	// 創(chuàng)建 User 和 Profile
	user, err := client.User.
		Create().
		SetName("John").
		SetProfileAge(30).
		Save(context.Background())
	if err != nil {
		log.Fatal("Failed to create user:", err)
	}

	// 查詢 User 并預(yù)加載 Profile
	result, err := client.User.Query().
		Where(user.Name("John")).
		WithProfile().
		Only(context.Background())
	if err != nil {
		log.Fatal("Failed to query user:", err)
	}

	// 輸出結(jié)果
	fmt.Println("User:", result)
}

特點:

  • 使用 Ent schema 來定義數(shù)據(jù)模型和關(guān)聯(lián)關(guān)系。
  • 使用 生成的代碼 來進行查詢和數(shù)據(jù)操作(通過構(gòu)建器模式)。
  • 需要生成代碼,且對數(shù)據(jù)庫操作有強類型的保障。

4. 對比總結(jié)

圖片

5. 選擇建議

  • 選擇 GORM:如果你需要一個快速、靈活的 ORM,支持豐富的功能,并且在項目中不需要特別復(fù)雜的類型安全或生成代碼的機制,GORM 是一個很好的選擇。它有著非?;钴S的社區(qū)和大量的文檔資源,適合小到中型項目。
  • 選擇 Ent:如果你對類型安全和性能有更高的要求,或者項目比較大,需要一個強類型的查詢構(gòu)建器,Ent 是一個更適合的選擇。Ent 可以幫助你更好地組織代碼,尤其是在復(fù)雜數(shù)據(jù)庫和多表關(guān)聯(lián)的場景下。它適合大型、復(fù)雜的項目,尤其是當(dāng)你的團隊更注重代碼生成和類型安全時。

6. 總結(jié)

  • GORM 更適合需要快速開發(fā)和靈活操作的項目,尤其是中小型項目。
  • Ent 更適合對類型安全、性能和可維護性要求較高的項目,尤其是大型系統(tǒng)。
責(zé)任編輯:武曉燕 來源: Go語言圈
相關(guān)推薦

2024-04-03 08:28:31

GolangPHP語言

2017-06-27 15:08:05

大數(shù)據(jù)Apache SparKafka Strea

2020-04-15 10:21:43

云計算AWSAzure

2025-03-05 08:58:53

Warp終端Ghostty

2021-01-13 16:04:07

網(wǎng)絡(luò)On-Prem托管

2015-09-16 11:29:46

超融合架構(gòu)軟件定義存儲

2022-01-25 19:36:46

ChromeBrave瀏覽器

2022-01-26 10:26:57

ChromeBrave網(wǎng)頁瀏覽器

2016-05-31 11:00:43

數(shù)據(jù)中心數(shù)據(jù)中心硬件數(shù)據(jù)中心搭建

2023-11-23 13:10:24

Python框架

2020-08-25 09:14:17

對象存儲文件存儲塊存儲

2023-05-22 19:49:30

命令Linux

2024-09-12 22:45:47

2014-09-28 10:29:43

喬布斯施密特Android

2021-12-23 15:36:21

NASSANDAS

2024-03-19 08:36:19

2019-04-02 15:07:51

API NginxZuul

2025-02-18 16:00:00

代碼Python架構(gòu)

2017-07-25 14:45:32

GlusterFSCeph存儲

2025-04-27 02:20:00

.NET開發(fā)框架
點贊
收藏

51CTO技術(shù)棧公眾號