这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
接下来我会对以下几方面进行总结:database理解,GORM使用简介
Database/sql理解
-
设计原理:database/sql为上层的应用程序提供了一个标准的api操作接口,为下层区段提供了一个驱动接口,在database/sql包里实现了连接池管理(池化技术)。
连接池管理有两个方法:
连接池配置
func (db *DB) SetConnMaxIdleTime(d time.Duration)
func (db *DB) SetConnMaxLifetime(d time.Duration)
func (db *DB) SetMaxIdleConns(n int)
func (db *DB) SetMaxOpenConns(n int)
连接池状态
func (db *DB) Stats()DBStats
- Driver连接接口:
import _ "github.com/go-sql-driver/mysql"
func main(){
db, err := sql.Open("mysql","gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local")
}
func init(){
sql.Register("mysql",&MySQLDriver{})
}
我们可以用应用结构体去改良上述的Driver连接,具体举例如下:
import _ "github.com/go-sql-driver/mysql"
func main(){
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)
}
用上述明确的字段来创建连接。
Gorm简介
- SQL怎么生成
普通的SQL语句:找出年龄大于35岁并且角色不是管理者的打工人按照年龄排序等
SELECT 'name', 'age', 'employee_number' %Select clause
FROM 'users' %From clause
WHERE %Where clause
role <> "manager" AND
age > 35
ORDER BY age DESC %Order By clause
LIMIT 10 OFFSET 10 %Limit Clause
FOR UPDATE %For Clause
使用gorm
db.Where("role <> ?","manager").Where("age > ?",35).Limit(100).Order("age desc").Find(&user)
前面全是 Chain method 最后是Finisher Method(决定这个gorm statement 最终方法)
这里我想说一下我在“抖音”制作项目中遇到的一个小问题:gorm Order用法可以是增或者减。这里我们需要注意如果是增许之需要在()中输入按照什么属性去增序即可;减序需要在后面加上desc,如上面例子所示。那么现在就衍生出一个问题,如果不是按照增或减的顺序怎么办呢?
我们想要按照特定的顺序[7,2,5,3]去输出结果,我们可以添加下面Chain method方法去实现:
.Clauses(clause.OrderBy{
Expression: clause.Expr{SQL: "FIELD(id,?)", Vars: []interface{}{[7,2,5,3]}, WithoutParentheses: true}}).
- 插件怎么工作: Finisher -> 决定statment类型 -> 执行Callbacks -> 生成 SQL并执行
Callbacks有六种模式: Create, Query, Update, Delete, Row, Raw