GORM框架学习笔记

本文是关于GORM,一个适用于Go语言的ORM框架的学习笔记。内容涵盖连接数据库、模型定义、SQL操作(如新增、删除、修改、查询记录)以及调试SQL等方面,特别强调了其对MySQL的支持和连接池的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

gorm是面向golang语言的一种ORM(持久层)框架,支持多种数据库的接入,例如MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开发者对于sql语言的掌握程度,使用提供的API进行底层数据库的访问。

笔记将会使用mysql数据库作为示例进行演示

使用步骤

一般而言对于数据库的使用步骤如下

  1. 创建连接。这个步骤一般会有引入一个数据库驱动的概念,我们的代码就是通过这个驱动去操作底层的数据库。
  2. 利用连接执行sql语句,操作数据库。
  3. 获取并解析结果。
  4. 关闭连接。

连接数据库

其中 dsn 中的 user,pass,dbname 分别替换成你自己的数据库连接账号,密码,以及默认连接的哪个数据库。ip,port 则替换成数据库实例的 ip地址与端口号。

基本用法

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

func main() {
   
  // ex: root:rootpass@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s
  dsn := "user:pass@tcp(ip:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
   })
}

进阶用法 - 支持各种高级配置,以及自定义数据库驱动

import (
  "my_mysql_driver"
  "gorm.io/gorm"
)

func main() {
   
    db, err := gorm.Open(mysql.New(mysql.Config{
   
      DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
      DefaultStringSize: 256, // string 类型字段的默认长度
      DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
      DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
      DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
      SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
      DriverName: "my_mysql_driver",
    }), &gorm.Config{
   })
}

连接池

数据库操作都是通过连接去执行的,频繁创建与销毁连接,是需要花费较大代价的,因此一般都采用连接池对连接进行复用。GORM 使用 database/sql 维护连接池

sqlDB, err := db.DB()

// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

模型定义

模型定义就是将数据库中的表结构映射为代码层面的model
例如数据库表 user

CREATE TABLE `sys_user_info` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` varchar(32) COLLATE utf8mb4_general_ci NOT NULL 
### Go Gin框架GORM框架的集成及使用教程 #### 项目初始化 创建一个新的Go模块并安装必要的依赖包。通过命令行工具来设置环境,确保所有必需组件都已就绪。 ```bash go mod init myproject go get -u github.com/gin-gonic/gin go get -u gorm.io/gorm go get -u gorm.io/driver/mysql ``` 这些命令分别用于初始化新的Go模块、获取Gin框架及其所需的支持库以及获取GORM ORM支持MySQL数据库的操作[^4]。 #### 配置数据库连接 为了使应用程序能够访问数据库,在`main.go`文件中添加如下代码片段: ```go package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func InitDB() *gorm.DB { dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } return db } ``` 此函数负责打开到指定MySQL实例的数据源名称(DSN),并通过它建立一个持久化的数据库会话对象[^3]。 #### 定义数据模型 接下来定义一些结构体表示要存储于关系型数据库中的实体类。这里以用户表为例展示基本语法: ```go type User struct { ID uint `json:"id"` Name string `json:"name" binding:"required,min=3,max=50"` Email string `json:"email" binding:"required,email"` Password string `json:"-" binding:"required,min=6"` // 不返回给客户端 } // 自动迁移模式 db.AutoMigrate(&User{}) ``` 这段代码展示了如何声明一个简单的用户记录映射至SQL表格的方式,并调用了自动迁移功能使得程序可以根据定义自动生成相应的DDL语句[^2]。 #### 实现RESTful API接口 利用Gin路由机制快速构建HTTP服务端点。下面是一个完整的例子说明怎样实现增删改查(CRUD)操作: ```go router.POST("/users", func(c *gin.Context) { var user User c.BindJSON(&user) result := db.Create(&user) if result.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"error":result.Error}) return } c.JSON(http.StatusOK, user) }) router.GET("/users/:id", func(c *gin.Context){ id := c.Param("id") var user User if err := db.First(&user,id).Error;err!=nil{ c.AbortWithStatus(http.StatusNotFound) return }else{ c.JSON(http.StatusOK,user) } }) router.PUT("/users/:id", func(c *gin.Context){ id:=c.Param("id") var updateUser=User{} if err:=c.ShouldBindJSON(&updateUser);err!=nil{ c.JSON(http.StatusBadRequest,err) return } tx:=db.Model(&User{}).Where("id=?",id).Updates(updateUser) if tx.RowsAffected==0{ c.JSON(http.StatusNotFound,"not found") return } c.JSON(http.StatusOK,map[string]interface{}{ "message":"success", "rows_affected":tx.RowsAffected, }) }) router.DELETE("/users/:id", func(c *gin.Context){ id:=c.Param("id") tx:=db.Delete(&User{},id) if tx.RowsAffected==0{ c.JSON(http.StatusNotFound,nil) return } c.JSON(http.StatusOK,gimn.H{"message":"deleted"}) }) ``` 上述代码实现了四个标准路径处理器,它们对应着不同的HTTP请求方法(GET/POST/PUT/DELETE)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值