Go语言数据库编程GORM 的基本使用详解

 更新时间:2025年06月27日 14:46:39   作者:程序员爱钓鱼  
GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作,提升开发效率,本文给大家介绍Go语言GORM使用,感兴趣的朋友一起看看吧

GORM 是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近于高层语言的 ORM。

一、安装与初始化

1. 安装 GORM 及数据库驱动

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
# PostgreSQL 用户:
# go get -u gorm.io/driver/postgres

2. 建立数据库连接

package main
import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "log"
)
func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/gormdb?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("连接数据库失败:", err)
    }
    log.Println("连接成功")
}

二、定义模型结构体

type User struct {
    ID       uint   `gorm:"primaryKey"`
    Name     string
    Email    string `gorm:"uniqueIndex"`
    Age      int
    CreatedAt time.Time
}
  • • 使用 GORM 标签配置字段属性。
  • • 支持自动创建 idcreated_at 等字段。

三、自动迁移表结构

db.AutoMigrate(&User{})

✅ 会自动创建表,如果表存在则进行字段比对与升级(非破坏性)。

四、基本 CRUD 操作

1. 新增数据

user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
db.Create(&user)
fmt.Println("新ID:", user.ID)

2. 查询数据

var user User
db.First(&user, 1)                         // 主键查询
db.First(&user, "email = ?", "alice@example.com") // 条件查询
  • • First:查询一条
  • • Find:查询多条
  • • Where 支持链式调用:
var users []User
db.Where("age > ?", 20).Order("age desc").Limit(10).Find(&users)

3. 更新数据

db.Model(&user).Update("Name", "Alice Updated")
db.Model(&user).Updates(User{Name: "NewName", Age: 28}) // 多字段

4. 删除数据

db.Delete(&user)

五、条件构造器

GORM 支持各种链式条件语句:

db.Where("name LIKE ?", "%alice%").Find(&users)
db.Where("age BETWEEN ? AND ?", 20, 30).Find(&users)
db.Not("name = ?", "Bob").Find(&users)

六、钩子函数(Hooks)

你可以定义方法拦截模型的创建、更新、删除行为:

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
    u.Name = "【新建】" + u.Name
    return
}

七、事务处理

err := db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&User{Name: "TxUser"}).Error; err != nil {
        return err
    }
    if err := tx.Delete(&User{}, 1).Error; err != nil {
        return err
    }
    return nil
})

八、日志与调试

GORM 支持 SQL 日志:

import "gorm.io/gorm/logger"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info),
})

九、常用配置项

配置说明
CreateFirstFindDeleteUpdate基础 CRUD
WhereOrderLimitOffset链式构造条件
AutoMigrate自动建表/更新表结构
Model(&Model{})设置操作对象

十、小结

功能示例
创建表db.AutoMigrate(&User{})
插入db.Create(&user)
查询db.Firstdb.Where().Find
更新db.Model().Updates()
删除db.Delete(&user)
事务db.Transaction(func)

到此这篇关于Go语言数据库编程:GORM 的基本使用的文章就介绍到这了,更多相关Go语言GORM使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GoFrame通用类型变量gvar与interface基本使用对比

    GoFrame通用类型变量gvar与interface基本使用对比

    这篇文章主要为大家介绍了GoFrame通用类型变量gvar与interface基本使用对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言基础设计模式之策略模式示例详解

    Go语言基础设计模式之策略模式示例详解

    这篇文章主要为大家介绍了Go语言基础设计模式之策略模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • Go Fiber快速搭建一个HTTP服务器

    Go Fiber快速搭建一个HTTP服务器

    Fiber 是一个 Express 启发 web 框架基于 fasthttp ,最快 Go 的 http 引擎,这篇文章主要介绍了Go Fiber快速搭建一个HTTP服务器,需要的朋友可以参考下
    2023-06-06
  • Go项目怎么使用枚举

    Go项目怎么使用枚举

    枚举是一种很重要的数据类型,本文主要介绍了Go项目怎么使用枚举,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go prometheus metrics条目自动回收与清理方法

    Go prometheus metrics条目自动回收与清理方法

    这篇文章主要为大家介绍了Go prometheus metrics条目自动回收与清理方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Go-Web框架中AOP方案的实现方式

    Go-Web框架中AOP方案的实现方式

    本文主要介绍了Go-Web框架中AOP方案的实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Go语言学习教程之结构体的示例详解

    Go语言学习教程之结构体的示例详解

    结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(field),每个字段有一个名字和一个类型。本文通过一些示例带大家深入了解Go语言中结构体的使用,需要的可以参考一下
    2022-09-09
  • Golang实现CronJob(定时任务)的方法详解

    Golang实现CronJob(定时任务)的方法详解

    这篇文章主要为大家详细介绍了Golang如何通过一个单 pod 去实现一个常驻服务,去跑定时任务(CronJob),文中的示例代码讲解详细,需要的可以参考下
    2023-04-04
  • 使用Golang实现加权负载均衡算法的实现代码

    使用Golang实现加权负载均衡算法的实现代码

    这篇文章主要介绍了使用Golang实现加权负载均衡算法的实现代码,详细说明权重转发算法的实现,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • golang正则之命名分组方式

    golang正则之命名分组方式

    这篇文章主要介绍了golang正则之命名分组方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论