这是我参与「第三届青训营 -后端场」笔记创作活动的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浅显的理解,如有错误欢迎指出。