这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。
1.database/sql
基本用法
import (
"database/sql"//这个包里有连接池,一些接口用于连接数据库和操作数据库
_"github.com/go-sql-driver/mysql"
)
func main(){
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello") //使用driver+DSN初始化DB连接
rows, err := db.Query("select id, name from users where id = ?", 1) //执行sql
if err != nil{
//xxx
}
//处理完毕,释放资源,虽然rows.Next最后会释放,但是担心在rows.Scan中有异常导致资源泄漏
defer func(){
err = rows.Close()
}
//处理获得的数据
var users []User
for rows.Next(){ //不断获得下一条数据
vae user User
err := rows.Scan(&user.ID, &user.Name) //从rows中提取
if errr != nil{
// ...
}
users = append(users, user) //加到user
}
if rows.Err() != nil{
//...
}
//早年的用法:注册全局Driver,是一个连接接口
func init(){
sql.Register("mysql", &MySQLDriver{})
}
}
基本原理
连接接口:注册driver
//早年写法,语义不清晰,容易忘记import driver
db, err := sql.Open(
mysql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
)
//更好的写法,使用结构体,使每个字段的含义更清晰,而且会自动import driver
connector, err := mysql.NewConnector(&mysql.Config{
User: "gorm",
Passwd: "gorm",
Net: "tcp",
Addr: "127.0.0.1:3306",
DBName: "gorm",
ParseTime: true,
})
db := sql.OpenDB(connector)
操作接口
基本crud操作见Database/SQL与GORM实践
2.GORM使用简介
设计简洁、功能强大、自由拓展的全功能 ORM(对象关系映射),自动import driver和close释放资源
基本用法
建立driver
db, err := gorm.Open(
mysql.Open("user:password@tcp(127.0.0.1:3306)/hello")
)
select 操作
var user User
err = db.Select("id","name").Find(&users, 1).Error
模型定义
下面是一些惯例约定:
- 表名是 stuct name 的复数格式
- 字段名是field name 的单数格式
- ID / Id 字段为主键,如果是数字,则为自增主键
- CreatedAt 字段,创建时保存当前时间
- UpdatedAt 字段,创建、更新时保存当前时间
- DeletedAt 字段,默认开启 soft delete 模式
关联介绍
3.GORM设计原理
SELECT * FROM user WHERE role <> "manager" AND age > 35 ORDER BY age desc LIMIT 100
使用GORM可以代替为
db.Where("role <> ?", "manager").Where("age > ?", 35).Limit(100).Order("age desc").Find(&user)
GORM STATEMENT 由 GORM Clauses 和 Finisher Method来构成
其中 GORM Clauses 包括了多个 Chain Method
执行流程:Finisher Method => 决定 Statement 类型 => 执行 Callbacks => 生成 SQL 并执行