go-orm
介绍
godemo是一款go目前主流的orm框架
软件架构
官方文档 GORM - The fantastic ORM library for Golang, aims to be developer friendly.
使用说明
安装教程
1.设置代理
go env -w GOPROXY=https://goproxy.cn,direct
2.打算使用gin 搭配gorom 进行学习模拟web开发
## 安装gin
go get -u github.com/gin-gonic/gin
#数据库驱动和orm
go get gorm.io/driver/mysql
go get gorm.io/gorm
连接
数据库连
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "用户名:密码@tcp(127.0.0.1:3306)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
})
添加配置 自定义驱动
import (
_ "example.com/my_mysql_driver"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
db, err := gorm.Open(mysql.New(mysql.Config{
DriverName: "my_mysql_driver",
DSN: "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local", // data source name, 详情参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &gorm.Config{})
// 日志配置
var mysqlLogger logger.Interface
// 要显示的日志等级
mysqlLogger = logger.Default.LogMode(logger.Info)
db, _ := gorm.Open(mysql.New(mysql.Config{
// leave blank for default driver
DSN: "root:111111@tcp(127.0.0.1:3306)/ruiji?charset=utf8&parseTime=True&loc=Local", // data source name, 详情参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &gorm.Config{
Logger: mysqlLogger, //注册
SkipDefaultTransaction: true, // 禁用默认事务
})
sqlDB, _ := db.DB()
// 设置空闲连接池中的最大连接数。ol.
sqlDB.SetMaxIdleConns(10)
// 设置与数据库的最大打开连接数
sqlDB.SetMaxOpenConns(100)
// 设置可以重复使用连接的最长时间。
sqlDB.SetConnMaxLifetime(time.Hour)
CRUD
假如有model
type Student struct {
ID uint // 默认使用ID作为主键
//设置字段长度为2
Name string `gorm:"size:10"`
Sex string `gorm:"size:2"`
Email *string // 使用指针是为了存空值
Age int
}
gorm中的tag约束 除开上述 还有以下 可以做到创建表时候约束
创建表
如果存在也不会报错 如果结构体和数据库模型 不一样则执行的是alter 更改数据库的操作
使用 AutoMigrate 方法自动迁移你的 schema,这将会创建数据库中不存在的表。
db.AutoMigrate(&Product{})
插入数据
单挑数据插入
db.Create(s) s是该映射结构体的指针
func insertStudent(c *gin.Context) {
s := new(Student)
if err := c.ShouldBindQuery(s); err != nil {
return
} else {
db.Create(s)
c.JSON(200, gin.H{
"data": s,
"message": "创建用户成功",
})
}
}
批量插入 同样 参数传递结构体切片即可
func bentchInserter(c *gin.Context) {
students := make([]Student, 10)
for i := 1; i <= 20; i++ {
students = append(students, Student{
Name: "测试" + strconv.Itoa(i),
Age: i,
Sex: "男",
//Email: nil,
})
}
db.Create(&students)
c.JSON(200, gin.H{
"data": students,
"message": "批量创建用户成功",
})
}
插入后该指针结构体的id字段就会被填充
删除
api delete
//第一个参数 是映射结构体指针 第二个参数是id 只有空结构体指针时候代表删除全表
db.Delete(s, id)
等效
s.ID = uint(parsedID)
db.Delete(s)
Or where 拼接查询条件 可以使用?方式进行拼接sql
db.Or("age<?", 18).Where("name", "测试张三").Delete(s, id) // 根据主键删除
日志
[4.352ms] [rows:1] DELETE FROM students
WHERE name
= ‘测试张三’ AND students
.id
= ‘1’
注意
gorm 对于不携带条件的批量修改字段 比如UPDATE
students
SETsex
=‘妈妈’() ,DELETE FROMstudents
这俩个sql正常来说是会改变整个表的记录,但是gorom 并不会去执行sql1 go中的api
s := new(Student) db.Model(s).Update("sex", "妈妈")
sq2
db.Delete(s)
但是加一个简单的条件
db.Model(s).Where(