Golang如何使用gorm连接数据库并操作数据

来源:AI编程作者:柬埔寨程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Golang如何使用gorm连接数据库并操作数据》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Golang如何使用gorm连接数据库并操作数据》有用,将其分享出去将是对创作者最好的鼓励。

在Golang项目开发中,使用gorm框架可以大幅简化数据库操作的复杂度,避免手动编写繁琐的SQL语句,同时支持多种主流数据库,适配性很强。下面将从基础准备到实际操作逐步讲解完整的使用流程。

Golang如何使用gorm连接数据库并操作数据

环境准备与依赖安装

首先需要在项目中安装gorm核心库和对应数据库的驱动,以MySQL为例,执行以下命令安装依赖:

# 安装gorm核心库
go get -u gorm.io/gorm
# 安装MySQL驱动
go get -u gorm.io/driver/mysql

如果使用其他数据库,只需要替换对应的驱动即可,比如PostgreSQL可以安装gorm.io/driver/postgres,SQLite可以安装gorm.io/driver/sqlite。

连接数据库

gorm连接数据库需要传入对应的DSN字符串,不同数据库的DSN格式略有差异,下面是MySQL的连接示例:

package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "log"
)

func main() {
    // MySQL的DSN格式:用户名:密码@tcp(数据库地址:端口)/数据库名?参数
    dsn := "root:123456@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
    // 打开数据库连接
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("连接数据库失败: %v", err)
    }
    // 获取底层sql.DB对象,可设置连接池参数
    sqlDB, err := db.DB()
    if err != nil {
        log.Fatalf("获取底层DB对象失败: %v", err)
    }
    // 设置最大打开连接数
    sqlDB.SetMaxOpenConns(100)
    // 设置最大空闲连接数
    sqlDB.SetMaxIdleConns(10)
    log.Println("数据库连接成功")
}

定义模型与自动建表

gorm通过结构体来映射数据库表,结构体的字段对应表的列,下面是用户表的模型定义示例:

// User 用户模型,对应数据库中的users表
type User struct {
    // gorm.Model内置了ID、CreatedAt、UpdatedAt、DeletedAt字段
    gorm.Model
    Name  string `gorm:"type:varchar(100);not null"` // 用户名,非空,长度100
    Age   int    `gorm:"type:int;default:0"`         // 年龄,默认0
    Email string `gorm:"type:varchar(100);unique"`   // 邮箱,唯一
}

定义好模型后,可以使用AutoMigrate方法自动创建表或者更新表结构:

// 自动迁移表结构,会创建users表,如果表已存在会更新字段
err = db.AutoMigrate(&User{})
if err != nil {
    log.Fatalf("自动建表失败: %v", err)
}

数据插入操作

插入单条数据和批量插入的示例如下:

// 插入单条数据
user1 := User{Name: "张三", Age: 20, Email: "zhangsan@ipipp.com"}
result := db.Create(&user1)
if result.Error != nil {
    log.Printf("插入单条数据失败: %v", result.Error)
} else {
    log.Printf("插入成功,用户ID: %d", user1.ID)
}

// 批量插入数据
users := []User{
    {Name: "李四", Age: 22, Email: "lisi@ipipp.com"},
    {Name: "王五", Age: 25, Email: "wangwu@ipipp.com"},
}
result = db.Create(&users)
if result.Error != nil {
    log.Printf("批量插入失败: %v", result.Error)
} else {
    log.Printf("批量插入成功,插入条数: %d", result.RowsAffected)
}

数据查询操作

gorm提供了丰富的查询方法,下面是常见的查询场景示例:

// 查询单条数据,根据主键查询
var user User
db.First(&user, 1) // 查询ID为1的用户
log.Printf("查询到的用户: %+v", user)

// 根据条件查询单条数据
db.Where("name = ?", "张三").First(&user)
log.Printf("姓名为张三的用户: %+v", user)

// 查询多条数据
var userList []User
db.Where("age > ?", 20).Find(&userList) // 查询年龄大于20的所有用户
log.Printf("年龄大于20的用户列表: %+v", userList)

// 查询所有数据
db.Find(&userList)
log.Printf("所有用户: %+v", userList)

// 统计数量
var count int64
db.Model(&User{}).Where("age > ?", 20).Count(&count)
log.Printf("年龄大于20的用户数量: %d", count)

数据更新操作

更新操作可以分为更新单个字段和批量更新多个字段:

// 更新单个字段,更新ID为1的用户年龄
db.Model(&User{}).Where("id = ?", 1).Update("age", 21)

// 更新多个字段
db.Model(&User{}).Where("id = ?", 1).Updates(User{Name: "张三三", Age: 22})

// 使用map更新多个字段
db.Model(&User{}).Where("id = ?", 1).Updates(map[string]interface{}{"name": "张三", "age": 23})

数据删除操作

gorm默认使用软删除,也就是不会真正删除数据库记录,而是更新deleted_at字段,如果需要硬删除可以调用Unscoped方法:

// 软删除,ID为1的用户会被标记删除
db.Delete(&User{}, 1)

// 硬删除,真正从数据库中删除记录
db.Unscoped().Delete(&User{}, 1)

// 根据条件批量软删除
db.Where("age < ?", 18).Delete(&User{})

注意事项

  • DSN中的参数需要根据实际情况调整,比如时区、字符集等,避免出现时间解析错误或者乱码问题
  • 模型结构体的字段标签可以自定义列名、类型、约束等,不需要和结构体字段名完全一致
  • 软删除的记录默认不会被普通查询语句查到,如果需要查询包含软删除的记录,可以使用Unscoped方法
  • 连接池的参数需要根据项目的实际并发量调整,避免连接数不足或者资源浪费

Golanggorm数据库连接数据操作ORM修改时间:2026-07-23 00:00:45

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。