InfoSphere/GORM 中文版/ 返回书籍
入门指南

概述

qianmoQqianmoQ· 更新于 2026-09-15· 阅读 6 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

GORM 是一个面向 Golang 的优秀 ORM 库,致力于提供对开发者友好的使用体验。

概览

  • 功能完整的 ORM
  • 关联关系支持(Has One、Has Many、Belongs To、Many To Many、多态关联、单表继承)
  • Hooks 钩子(Create / Save / Update / Delete / Find 操作前后执行)
  • 支持通过 PreloadJoins 进行预加载
  • 事务、嵌套事务、保存点(Save Point)、回滚到指定保存点(RollbackTo)
  • Context、预编译语句模式(Prepared Statement Mode)、DryRun 模式
  • 批量插入、FindInBatches、使用 Map 进行 Find/Create、支持 SQL 表达式和 Context Valuer 的 CRUD 操作
  • SQL Builder、Upsert、锁机制、优化器 / 索引 / 注释 Hint、命名参数、子查询
  • 复合主键、索引、约束
  • 自动数据库迁移(Auto Migrations)
  • 日志系统(Logger)
  • 泛型 API,支持类型安全的查询和数据库操作
  • 可扩展、灵活的插件 API:
    • Database Resolver(多数据库、读写分离)
    • Prometheus
  • 所有功能均配有测试
  • 对开发者友好

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

快速开始

泛型 API(>= v1.30.0)

package main

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

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

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

  ctx := context.Background()

  // 自动迁移数据库表
  db.AutoMigrate(&Product{})

  // 创建数据
  err = gorm.G[Product](db).Create(ctx, &Product{Code: "D42", Price: 100})

  // 查询数据
  product, err := gorm.G[Product](db).Where("id = ?", 1).First(ctx)
  products, err := gorm.G[Product](db).Where("code = ?", "D42").Find(ctx)

  // 更新单个字段
  err = gorm.G[Product](db).Where("id = ?", product.ID).Update(ctx, "Price", 200)

  // 更新多个字段
  err = gorm.G[Product](db).Where("id = ?", product.ID).Updates(
    ctx,
    Product{Code: "D42", Price: 100},
  )

  // 删除数据
  err = gorm.G[Product](db).Where("id = ?", product.ID).Delete(ctx)
}

传统 API

package main

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

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

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

  // 自动迁移数据库表
  db.AutoMigrate(&Product{})

  // 创建数据
  db.Create(&Product{Code: "D42", Price: 100})

  // 查询数据
  var product Product
  db.First(&product, 1)
  db.First(&product, "code = ?", "D42")

  // 更新单个字段
  db.Model(&product).Update("Price", 200)

  // 更新多个字段
  db.Model(&product).Updates(Product{Price: 200, Code: "F42"})
  db.Model(&product).Updates(map[string]interface{}{
    "Price": 200,
    "Code":  "F42",
  })

  // 删除数据
  db.Delete(&product, 1)
}

GitHub 最新 SemVer 版本

评论

登录后参与评论

正在加载评论…