import(
"datanase/sql"
_ "github.com/go-sql-driver/mysql"
)
func main(){
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
rows, err := db.Query("select id", 1)
if err != nil{
...
}
defer rows.Close()
var users []User
for rows.Next(){
var user User
err := rows.Scan(&user.ID, &user.Name)
if err != nil {
...
}
users = append(users, user)
}
// 一个容易被遗漏的err
if rows.Err() != nil{
...
}
}
连接池配置 连接池状态: 从连接池获取链接或通过driver新建连接\
db, err := sql.Open("mysql", "gorm:gorm@tcp(localhost:99 ... ")
dfn字符串很长,可读性大,转义困难 \
2017年 传入interface,新的连接接口
DB连接的几种类型
- Conn直接连接:tcp
- Stmt预编译:传递reference id,对于相同的查询传递一样的,减少网络传输和分析语句的时间
- Tx事物
返回数据的几种方式
- Exec/ExecContext -> Result
- Query/ QueryContext -> Row
- QueryRow/ QueryRowContext -> Row(简化)
GORM基础使用
全功能ORM - 磨刀不误砍柴工 Don't repeat yourself
见文档
Gorm 设计原理
如何通过一行配置加快服务性能?
SQL生成
应用程序 -> GORM --操作接口--> database/sql
db.Where("role <> ?", "manager").Where("age > ?", 35").Limit(100).Order("age desv").Find(&user)
Finisher Method 决定类型/执行
Find -> Select
Create -> insert
Update -> update
根据当前的Finisher确定最终的sql
拓展子句
hints.UseInext()
hits.ForceIndex()
插件拓展
预定义Create callbacks,执行Create过程,一次调用注册的Create Callbacks
ConnPool
db conn 实现 connPool,读写分离