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

142 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的1篇笔记。

课程导学链接 设计模式之database/sql与GORM实践

本课程目标为带领同学们了解 Go 的 Database/SQL的实现,了解 GORM 的实现原理、使用简单,以及如何基于 GORM 做一些定制化开发。

课程结构为:

  • 理解 database/sql
  • GORM 使用简介
  • GORM 设计原理
  • GORM 最佳实践 本文仅介绍database/sql的简单使用。

database/sql

Go语言标准库中提供了进行数据库操作的 database/sql 库,需要注意的是在使用 sql 库的时候需要导入数据库驱动。本文记录了 database/sql 标准库的学习笔记,希望对你有帮助。

1.导包

程序中需要导入两个包。

mysql驱动包只需要引入init()函数就行。

import (
	"database/sql"

    //通过_引入init()函数
	_"github.com/go-sql-driver/mysql"//驱动初始化
)

//初始函数给mysql注册了驱动
func init() {
    sql.Register("mysql", &MySQLDriver{})
}

database/sql只是一个数据库接口的一个抽象,真正与数据库打交道的,是各个数据库对应的驱动Driver;在使用时需要先注册对应的驱动库,然后就能通过标准库sql中定义的接口来统一操作数据库。

2.访问数据库

在sql包下的Open函数中,需要连接数据库的驱动。格式如下

"mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8"

初始化DB连接

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()
}

sql.DB并不是数据库连接,也并未在概念上映射到特定的数据库(Database)或模式(schema)。它只是一个抽象的接口,不同的具体驱动有着不同的实现方式。通常而言,sql.DB会处理一些重要而麻烦的事情,例如操作具体的驱动打开/关闭实际底层数据库的连接,按需管理连接池。

可以使用Ping函数来检查你创建的数据库连接是否可用

err = db.Ping()
if err != nil {
        // do something here
}

3.执行sql操作

有了db我们就可以用它来执行sql语句了,database/sql中的函数名有特殊的约定,函数名包含Query的函数只用于查询,返回若干个行,不返回行的操作应该用Exec()

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() 
    }
    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)
}

其中的?是MySQL中的占位符,后面调用查询时可以为其给出不同的参数。

结语

第一次写文章文笔拙劣,还请见谅。本文只是我对database/sql浅显的理解,如有错误欢迎指出。