Golang之Gorm基本使用

491 阅读3分钟

gorm是基于golang实现的可插拔的orm框架,将model与表进行一一关联后,可以通过struct来管理数据库中的数据。gorm提供了对多种数据库的支持,包括Mysql、SQLite、SQLServer、PostgreSQL等。目前gorm已成为golang web 开发中对数据管理的首选插件,相较于比它更早时期的xorm,gorm具有活跃的社区、稳定的性能。

本文以MySQL作为数据库,进行相关功能的测试,官方文档地址:gorm.io/zh_CN/docs/

安装

# 安装 gorm
go get -u gorm.io/gorm

# 安转 mysql 驱动
go get -u gorm.io/driver/mysql 

如何通过表生成gorm中的model

可以使用在线工具 www.printlove.cn/tools/sql2g… 进行转化

数据库连接

在数据库连接中可以设置连接地址、密码、连接池大小等

package models

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

var DB = Init()
func Init() *gorm.DB {
   dsn := "user:passport@tcp(192.168.1.1:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local"
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
   if err != nil {
      log.Println("gorm Init Error : ", err)
   }
   sqlDB, err := db.DB()
   // SetMaxIdleConns 设置空闲连接池中连接的最大数量
   sqlDB.SetMaxIdleConns(10)
   // SetMaxOpenConns 设置打开数据库连接的最大数量
   sqlDB.SetMaxOpenConns(100)
   return db
}

定义用于测试的表

用户表

CREATE TABLE `user_basic` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `identity` varchar(36) DEFAULT NULL COMMENT '唯一标识',
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `mail` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `pass_num` int(11) DEFAULT '0' COMMENT '完成问题的个数',
  `submit_num` int(11) DEFAULT '0' COMMENT '总提交次数',
  `is_admin` tinyint(1) DEFAULT '0' COMMENT '是否是管理员【0-否,1-是】',
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

定义model

user_basic.go

package models

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

type UserBasic struct {
   ID        uint           `gorm:"primarykey;" json:"id"`
   CreatedAt time.Time      `json:"created_at"`
   UpdatedAt time.Time      `json:"updated_at"`
   DeletedAt gorm.DeletedAt `gorm:"index;" json:"deleted_at"`
   Identity  string         `gorm:"column:identity;type:varchar(36);" json:"identity"` // 用户的唯一标识
   Name      string         `gorm:"column:name;type:varchar(100);" json:"name"`        // 用户名
   Password  string         `gorm:"column:password;type:varchar(32);" json:"password"` // 密码
   Phone     string         `gorm:"column:phone;type:varchar(20);" json:"phone"`       // 手机号
   Mail      string         `gorm:"column:mail;type:varchar(100);" json:"mail"`        // 邮箱
   PassNum   int64          `gorm:"column:pass_num;type:int(11);" json:"pass_num"`     // 通过的次数
   SubmitNum int64          `gorm:"column:submit_num;type:int(11);" json:"submit_num"` // 提交次数
   IsAdmin   int            `gorm:"column:is_admin;type:tinyint(1);" json:"is_admin"`  // 是否是管理员【0-否,1-是】
}

func (table *UserBasic) TableName() string {
   return "user_basic"
}

单表查询

  • 查询单条数据使用 First
data := new(models.UserBasic)
err := models.DB.Where("identity = ? ", "identity").First(&data).Error
if err != nil {
    println(err)
}
  • 查询多条数据使用 Find
data := make([]models.UserBasic, 0)
err := models.DB.Where("identity = ? ", "identity").Find(&data).Error
if err != nil {
    println(err)
}
  • 查询指定的字段使用 Select
data := make([]models.UserBasic, 0)
err := models.DB.Select("name").Where("identity = ? ", "identity").Find(&data).Error
if err != nil {
    println(err)
}

数据创建

使用 Create 创建数据

data := &models.UserBasic{
   Identity: "identity",
   Name:     "name",
   Password: "password",
   Phone:    "13300000000",
   Mail:     "xxxx@qq.com",
}
err = models.DB.Create(data).Error
if err != nil {
   println(err)
}

数据更新

使用 Updates 更新数据,默认值不更新

data := &models.UserBasic{
   Identity: "identity",
   Name:     "name",
   Password: "password",
   Phone:    "13300000000",
   Mail:     "xxxx@qq.com",
}
err = models.DB.Where("identity = 'identity'").Updates(data).Error
if err != nil {
   println(err)
}

数据删除

使用 Delete() 进行数据的删除,如果需要永久删除,使用 Unscoped() 函数

// 假删除
err = models.DB.Where("identity = 'identity'",).Delete(new(models.UserBasic)).Error
// 真删除
// err = models.DB.Where("identity = 'identity'",).Unscoped().Delete(new(models.UserBasic)).Error
if err != nil {
   println(err)
}