理解database/sql
database/sql go的标准库,不同数据库只要使用了标准库的接口,就可以统一的使用
在处理完数据后一定要记得rows.Close释放链接,否则可能会造成资源泄露
rows,err:=db,Query("select id name from user where id = ?",1)
这段代码的意思是,查询user中id=1的数据的name,但是上面的代码有一点问题,因为rows可能返回一个错误值,所以需要对返回值进行检查:
defer func(){
err:=rows.Close()
}
也不要忘记append,如果忘记可能会导致数据库运行时卡死
不要忘记处理rows.Err()
设计原理
database/sql使用了池化技术 默认会尝试两次连接,连接成功后有两种策略,使用已有的空闲连接,最开始我们都会尝试使用之前已有的连接,如果前面的连接都出错了,我们就会强制新建连接。
获取连接之后,使用defer确保需求完成之后把连接放回连接池,如果需求没完成可能连接会被直接放弃。
如果连接返回BadConnection,for循环会不断尝试2次
Go提供的最新的接口,相比原本的接口优势是会强制编译检查,所以不会忘记import dirver,同时因为是结构体的形式,相比原本很长的字符串,能更方便的对属性进行修改
GORM设计原理
找出所有年龄超过35且不是管理层的打工人,按年龄排序
SELECT 'name', 'age', 'employee_number'
FROM 'user'
WHERE
role <> "manager" AND
age > 35
ORDER BY age DESC
LIMIT 10 OFFSET 10
FOR UPDATE
Gorm查询同样的内容的方式
db.Where("role <> ?","manager").Where("age > ?",35).Limit(100).Order("age desc").Find(&user)
Clause:子句
由于不同的数据库,甚至同一数据库的不同版本它的sql语句不同,所以我们在实现时还要考虑这些因素,而使用gorm可以统一使用一套语句,因为gorm会判断数据库版本和类型,选择对应的语句进行初始化。