GORM与database/sql入门学习 | 青训营笔记

95 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的5篇笔记。 本节课的课程大纲如图所示

image.png

理解database/sql

import driver实现:

import (
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
)    

访问数据库

设计结构如图所示:

image.png database/sql中最重要的接口就是sql.DB,要注意sql.DB不是某一个数据库的映射,更加不是数据库连接,它只是一个数据库接口的一个抽象,在底层为你做两件事情

  1. 通过driver为你开启和关闭到底层数据库的连接
  2. 为你管理一个连接池 代码如下:
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应用程序的搭建。