Go(Golang)的ORM:比较与使用示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go(Golang)的ORM:比较与示例



使用Go(Golang)进行开发时,经常需要与数据库交互。为了替代编写原始SQL查询,开发者越来越多地使用ORM(对象关系映射)——这些工具可以自动在关系数据库和语言对象之间转换数据。本文将介绍Go语言中最流行的四个ORM:GORM、Ent、SQLBoiler和Bun。您将了解它们的优缺点,看到代码示例,并能够为您的项目做出明智的选择。



为什么Go需要ORM?

ORM解决了几个关键问题:

  • 减少样板代码 —— 无需手动编写CRUD操作。
  • 类型安全 —— Go编译器会检查结构体字段与表列是否匹配。
  • 模式迁移 —— 自动创建和更新表。
  • 数据库抽象 —— 切换DBMS(PostgreSQL、MySQL、SQLite)而无需重写查询。


1. GORM —— 最受欢迎的选择

GORM 是Go生态系统中事实上的ORM标准。它以其丰富的功能而闻名:自动迁移、钩子、方法链、事务支持和关系(Has Many、Belongs To、Many2Many)。



GORM代码示例

package main

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

type User struct { gorm.Model Name string Email string `gorm:"uniqueIndex"`}

func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") }

// 自动迁移 db.AutoMigrate(&User{})

// 插入 db.Create(&User{Name: "Alice", Email: "alice@example.com"})

// 读取 var user User db.First(&user, 1) // 按主键 db.First(&user, "email = ?", "alice@example.com")

// 更新 db.Model(&user).Update("Name", "Bob")

// 删除 db.Delete(&user)}


优点: 庞大的社区、丰富的文档、内置关联和钩子支持。

缺点: 复杂查询时性能有时较慢,存在魔法行为(例如自动修改字段)。



2. Ent —— 代码生成与强类型

Ent 来自Facebook(Meta)——它不仅仅是一个ORM,而是一个完整的实体工作框架。它根据用Go语法描述的模式生成Go代码。这提供了最大的性能和类型安全。



Ent代码示例

// schema/user.gopackage schema

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

type User struct { ent.Schema}

func (User) Fields() []ent.Field { return []ent.Field{ field.String("name"), field.String("email").Unique(), }}

// main.gopackage main

import ( "context" "log"

"entgo.io/ent/dialect/sqlite" "yourproject/ent")

func main() { client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&mode=rwc") if err != nil { log.Fatal(err) } defer client.Close()

ctx := context.Background() // 创建表 if err := client.Schema.Create(ctx); err != nil { log.Fatal(err) }

// 插入 u, _ := client.User.Create().SetName("Alice").SetEmail("alice@example.com").Save(ctx)

// 读取 user, _ := client.User.Get(ctx, u.ID) log.Println(user.Name)}


优点: 高性能、完全类型化、出色的图查询支持。

缺点: 学习曲线陡峭、需要运行代码生成、内置功能较少(例如没有钩子)。



3. SQLBoiler ——

推荐