go持久化框架 gorm框架使用

270 阅读4分钟

前言

gorm是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的,目前来说,是go中最流行的 orm 框架,而且其里面封装了丰富的api方法,供开发人员使用,易于开发人员简单上手,而且其支持多种数据库操作,让go操作数据库变得更加简单和易维护

gorm官网

以下地址是gorm框架的官网,有兴趣的自己上去查看

 https://gorm.io/zh_CN/docs/index.html

gorm依赖安装

安装gorm库

使用下面命令安装gorm依赖

go get -u gorm.io/gorm

安装对应数据库驱动

MySQL
go get -u gorm.io/driver/mysql
sqlite
go get -u gorm.io/driver/sqlite
postgres
go get -u gorm.io/driver/postgres
sqlserver
go get -u gorm.io/driver/sqlserver

等等,需要什么依赖自己上官网查看 备注:本文使用的是MySQL数据库

gorm操作数据库

连接数据库

gorm使用以下代码连接数据库

 "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

其中,user是用户名,pass是密码,至于数据库,修改dbname

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	fmt.Println(db)
}

查询数据

gorm提供了丰富的查询方法

First

获取第一条记录

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	var user User

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	db.Table("user").First(&user, "id = ?", 1690290594064429066)
	fmt.Println("查询数据为:", user)
	b := user.Name
	c := b.Valid
	fmt.Println(c)
	fmt.Println(b.Value())
}

其中,使用gorm声明结构体对应数据库字段

where

条件查询

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	var user []User

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	fmt.Println(db)
	db.Table("user").Where("user_name like ?", "%stu001%").Find(&user)
	fmt.Println(user)
}

Last

获取最后一条

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	var user []User

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	fmt.Println(db)
	db.Table("user").Where("user_name like ?", "%stu001%").Last(&user)
	fmt.Println(user)
}

插入数据

插入数据,代码为:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	user := User{
		Id: 1,
		Name: sql.NullString{
			"aaa",
			true,
		},
		Sex: 1,
	}

	result := db.Table("user").Create(&user) // 通过数据的指针来创建
	fmt.Println(result)
}

删除数据

delete

默认使用id删除

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	user := User{
		Id: 1,
		Name: sql.NullString{
			"aaa",
			true,
		},
		Sex: 1,
	}

	result := db.Table("user").Delete(&user)
	fmt.Println(result)
}

where

使用where条件删除数据

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	user := User{}

	result := db.Table("user").Where("user_name = ?", "stu002").Delete(&user)
	fmt.Println(result)
}

如果删除的user没有包含主属性,也就是Id,那么就会删除user_name,如果包含主属性,那么条件就包括Id

更新

更新的话,提供了save,具体如下:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id   int64          `gorm:"column:id"`
	Name sql.NullString `gorm:"column:user_name"`
	Sex  int            `gorm:"column:sex"`
}

func main() {

	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库错误:", err)
		return
	}
	user := User{
		Id: 1,
		Name: sql.NullString{
			"bbb",
			true,
		},
		Sex: 1,
	}

	result := db.Table("user").Save(&user)
	fmt.Println(result)
}

save()方法,如果主属性不存在,那么就会插入,如果主属性存在,那么就会更新

总结

gorm还提供了很多丰富的查询方法以及连表查询方法那些,有兴趣的话,可以自己研究一下,至于在开发中,怎么选择持久化框架,根据自己的上手习惯,毕竟go的持久化框架不止这一个,技术选型根据自己擅长的就行了