这是我参与「第三届青训营 -后端场」笔记创作活动的的5篇笔记。 本节课的课程大纲如图所示
理解database/sql
import driver实现:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
访问数据库
设计结构如图所示:
database/sql中最重要的接口就是
sql.DB,要注意sql.DB不是某一个数据库的映射,更加不是数据库连接,它只是一个数据库接口的一个抽象,在底层为你做两件事情
- 通过driver为你开启和关闭到底层数据库的连接
- 为你管理一个连接池 代码如下:
func main() {
db, err := sql.Open("mysql",
"user:password@tcp(127.0.0.1:3306)/hello")
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
这里Open()的第一个参数就是我们前面注册的名字"mysql",第二个参数则是用来告诉driver如何访问底层数据库(对于每种数据库,其格式不尽相同,具体查询driver的文档即可),db的类型为*sql.DB,后面的错误检查和defer db.Close()可以看作一种惯用法,每次都如此使用即可。
查询操作
var (
id int
name string
)
rows, err := db.Query("select id, name from users where id = ?", 1)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
修改操作
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
log.Fatal(err)
}
res, err := stmt.Exec("Dolly")
if err != nil {
log.Fatal(err)
}
lastId, err := res.LastInsertId()
if err != nil {
log.Fatal(err)
}
rowCnt, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)
GORM
当有了GORM之后,就不再需要去编写SQL语句,大大提升了效率,使用GORM提供的方法即可完成各种数据库的交互,与网络框架进行结合就可以进行web应用程序的搭建。