go数据库框架-gorm

803 阅读3分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

前言

 每个语言都有一些比较方便开发的orm数据库框架,go语言中有gorm、xorm等,本文主要介绍gorm框架的使用。

gorm介绍

官方地址github.com/go-gorm/gor…

特点

全特性 ORM (几乎包含所有特性)、模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关联)、钩子 (Before/After Create/Save/Update/Delete/Find)、预加载、事务、复合主键、SQL 构造器、自动迁移、日志、基于GORM回调编写可扩展插件、全特性测试覆盖、开发者友好。

gorm引入

github.com/jinzhu/gorm v1.9.2
github.com/go-sql-driver/mysql v1.6.0

在go.mod文件中,引入上面一行,然后 go mod vendor,如果没有看到引入,则可以新建一个文件,然后先import 导入,然后回去go.mod文件,在继续go mod vendor。

import "github.com/jinzhu/gorm"
import _ "github.com/go-sql-driver/mysql"

一旦涉及数据库操作,要记得同时引入mysql驱动,这样才能操作数据库。

数据库初始化

package mainimport "fmt"import "github.com/jinzhu/gorm"import _ "github.com/go-sql-driver/mysql"//参数含义:数据库用户名、密码、主机ip、连接的数据库、端口号func dbConn(User, Password, Host, Db string, Port int) *gorm.DB {   connArgs := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", User, Password, Host, Port, Db)   db, err := gorm.Open("mysql", connArgs)   if err != nil {      return nil   }   db.SingularTable(true)          //如果使用gorm来帮忙创建表时,这里填写false的话gorm会给表添加s后缀,填写true则不会   db.LogMode(true)                //打印sql语句   //开启连接池   db.DB().SetMaxIdleConns(100)        //最大空闲连接   db.DB().SetMaxOpenConns(10000)      //最大连接数   db.DB().SetConnMaxLifetime(10000)      //最大生存时间(s)   return db}func GetDb() (conn *gorm.DB) {   conn = dbConn("root", "123456", "10.252.79.16", "test", 7777)   if conn == nil {      fmt.Println("本次未获取到mysql连接")   }   return conn}

如上是数据库连接代码。

数据库表建立

下面是数据操作代码

type User struct {   Id      int     `gorm:"primary_key" json:"id"`   Name    string  `json:"name"`   Age     int     `json:"age"`   Gender  int     `json:"gender"`     //1:男、2:女}//添加数据func (user *User) Add() {   conn := GetDb()   defer conn.Close()   err := conn.Create(user).Error   if err != nil {      fmt.Println("创建失败")   }}//修改数据func (user *User) Update() {   conn := GetDb()   defer conn.Close()   err := conn.Model(user).Update(user).Error   if err != nil {      fmt.Println("修改失败")   }}//删除数据func (user *User) Del() {   conn := GetDb()   defer conn.Close()   err := conn.Delete(user).Error   if err != nil {      fmt.Println("删除失败")   }}

我们定义了一个结构体,并对应数据的User表,包含了增删改查操作,记得要注明primary_key表示id主键。

数据库表判断与创建

db:=GetDb()bo:=db.HasTable(&User{})if !bo {   db.CreateTable(&User{})}

先判断是否存在User表,如果不存在,则调用对应的方法创建。

数据库操作

user := new(User)user.Name = "张三"user.Age = 20user.Gender = 1user.Add()          //user.id = 1,添加之后user中的id会变成数据库中生成的值

这里就是在数据库里添加一条记录

我们可以看到对应的日志表示插入用户成功了。然后去数据库查看

可以看到数据库对应的记录,已经正确的插入了。如果要修改,同样的定义出结构体。

    user := new(entity.User)
    user.Id = 1  //修改需要知道主键id,当然也可以条件修改
    user.Name = "李四"
    user.Update()

如果要查询则使用where,则能查出对应的记录了。

user := new(User)
user.Name = "张三"GetDb().Where("name = ?", "张三").First(&user)c.JSON(http.StatusOK, gin.H{"status": "200","success":user})

更新操作

如果想手动将某个字段set为空值, 如下可以使用单独选定某些字段的方式来更新:

user := User{Id: 1}
db.Model(&user).Select("name").Update(map[string]interface{}{"name":"","age":0})

删除操作

user := new(User)
user.Id = 1
user.Del()

这就是基础的删除操作,可以把对应的id为1的记录删除。

总结

gorm框架在关系型数据库和对象之间作一个映射,方便了我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。