听课笔记--第五课第六课
这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
Gorm使用笔记
"database/sql"包
DSN初始化DB连接
- 通过rows取回返回的数据
- 处理完及时释放连接 可能导致服务卡死输入请求没有响应等问题
- 注意处理rows.Err()错误
连接池
- 连接池配置
- 连接池状态
- Driver连接接口 字符串、结构体
GORM使用
"gorm.io/grom"包
操作数据库、(批量)创建
关联操作
- 一条sql不一定比三条性能更优
- 级联删除,不应使用sql自带的
GORM设计原理
Chain Method和Finisher Method
Gorm实现代码样例
package main
import (
"fmt"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
//设置表名,可以通过给Food struct类型定义 TableName函数,返回一个字符串作为表名
//不重构TableName方法,gorm会默认将struct类型名加s作为表名 例如User结构体 查询users表而不会查tb_user表
func (v User) TableName() string {
return "tb_users"
}
func main() {
//db, err := gorm.Open(sqlite.Open("douyin.db"), &gorm.Config{})
// db,err :==gorgorm.Open(
// mysql.Open("user:password@tcp(127.0.0.1:3306)/hello")
username := "root" //账号
password := "admin" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "douyin" //数据库名
timeout := "10s" //连接超时,10秒
//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
//增
user := User{ID: "04", User_name: "lwll"}
result1 := db.Create(&user) //创建用户,并将结果传递出来
fmt.Printf("%d", result1.RowsAffected)
//删
var user1 User
db.Delete(&user1, 04) //删除主键为04的数据
db.Where("User_name=?", "lwl").Delete(&user1) //删除用户名为lwl的数据
//查
result2 := make(map[string]interface{}) //存放查询的结果
db.Model(&User{}).First(&result2) //查询所有结果中的第一个
db.Model(&User{}).First(&result2, 02) //查询主键字段为02的结果
db.Model(&User{}).Where("ID=?", "02").First(&result2) //查询ID列中元素为02的结果
fmt.Println(result2)
//改 --本质上就是在查询语句的基础上进行修改
db.Model(&User{}).Where("ID=?", "02").Update("User_name", "200")
//Update - 更新多个字段
db.Model(&User{}).Where("ID=?", "02").Updates(User{User_name: "2001"})
db.Model(&User{}).Where("ID=?", "02").Updates(map[string]interface{}{"User_name": "200"})
}