前言
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的持久化框架不止这一个,技术选型根据自己擅长的就行了