GORM快速入门教程

494 阅读3分钟

概览

GORM是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单,使用上主要就是把struct类型和数据库表记录进行映射,操作数据库的时候不需要直接手写Sql代码,这里主要介绍MySQL数据库。

GORM库github地址: github.com/go-gorm/gor…

安装

操作MySQL需要安装两个包:

  • MySQL驱动包

  • GORM包 使用go get命令安装依赖包

//安装MySQL驱动
go get -u gorm.io/driver/mysql
//安装gorm包
go get -u gorm.io/gorm

在数据库中创建表

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `age` int unsigned NOT NULL,
  `name` varchar(40) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

代码实例

导入依赖包

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

代码片段

package main

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

//定义User模型,绑定user表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应
//在这里User类型可以代表mysql user表
type User struct {
   ID int64 // 主键
   //通过在字段后面的标签说明,定义golang字段和表字段的关系
   //例如 `gorm:"column:name"` 标签说明含义是: Mysql表的列名(字段名)name
   //这里golang定义的Name变量和MYSQL表字段name一样,他们的名字可以不一样。
   Name string `gorm:"column:name"`
   Age  int64  `gorm:"column:age"`
}

//设置表名,可以通过给struct类型定义 TableName函数,返回当前struct绑定的mysql表名是什么
func (u User) TableName() string {
   //绑定MYSQL表名为users
   return "user"
}

func main() {
   //配置MySQL连接参数
   username := "your_account"    //账号
   password := "your_password" //密码
   host := "127.0.0.1"   //数据库地址,可以是Ip或者域名
   port := 3306          //数据库端口
   Dbname := "test"      //数据库名

   //通过前面的数据库参数,拼接MYSQL DSN, 其实就是数据库连接串(数据源名称)
   //MYSQL dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local
   //类似{username}使用花括号包着的名字都是需要替换的参数
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)
   //连接MYSQL
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

   if err != nil {
      panic("连接数据库失败, error=" + err.Error())
   }

   //定义一个用户,并初始化数据
   u := User{
      Name: "Rock",
      Age:  28,
   }

   //插入一条用户数据
   //下面代码会自动生成SQL语句:INSERT INTO `user` (`name`,`age`) VALUES ('Rock',28)
   res := db.Create(&u)
   if err := res.Error; err != nil {
      fmt.Println("插入失败", err)
      return
   }

   fmt.Printf("res:%+v", res.RowsAffected) // 输出影响行数
   //查询并返回第一条数据
   //定义需要保存数据的struct变量
   u = User{}
   // 自动生成sql: SELECT * FROM `user` WHERE name = 'Rock'  ORDER BY `user`.`id` LIMIT 1
   result := db.Where("name = ? ", "Rock").First(&u)
   if errors.Is(result.Error, gorm.ErrRecordNotFound) {
      fmt.Println("找不到记录")
      return
   }
   //打印查询到的数据
   fmt.Println(u.Name, u.Age)

   //更新
   //自动生成Sql:  UPDATE `user` SET `age`=29 WHERE id = '2'
   db.Model(&User{}).Where("id = ?", "2").Update("Age", 29)

   //删除
   //自动生成Sql: DELETE FROM `user` WHERE id = 4
   db.Where("id = ?", 4).Delete(&User{})
}

gorm错误处理

gorm库在执行数据库操作的时候,如果出现错误,则会更新gorm.DB的Error属性,Error属性默认为nil。

因此在执行数据库操作后检测下Error属性是否为nil即可知道有没有错误发生。

result := db.Where("name = ? ", "Rock").First(&u)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
   fmt.Println("找不到记录")
   return
}