go与数据库 | 青训营笔记

108 阅读2分钟

1.下载依赖

go get -u github.com/go-sql-driver/mysql

2. 测试连接数据库

	"database/sql"
	_ "github.com/go-sql-driver/mysql" //自动执行init方法 注入数据库驱动
	"log"
)

func main() {
	//数据库信息
	dsn := "root:root@tcp(127.0.0.1:3306)/test"
	//连接数据库
	DB, err := sql.Open("mysql", dsn) //不会校验 用户名,密码是否正确
	if err != nil {
		log.Fatal(err)
		return
	}
	//Ping检查与数据库的连接是否仍有效,如果需要会创建连接
	err = DB.Ping() //校验 dsn 是否正确
	if err != nil {
		log.Fatal(err)
		return
	}
	log.Fatal("测试连接成功")
}


3. 单行查询

4.多行查询

5. 插入

func insertData() {
	//1.写sql语句
	sql := `insert into user(name,age) values('ocean',33)`
	//2.exec
	result, err := db.Exec(sql)
	if err != nil {
		log.Fatal(err)
		return
	}
	//3.如果是 插入数据 的操作,能够拿到插入数据的 id
	id, err := result.LastInsertId()
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println(id)
}
func main() {
	err := initDB()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("测试数据库连接成功!")
	//queryrow(2)
	//queryMore(2)
	insertData()
}


举例相关的接口

sql.Register 接口

database/sql 的 Register() 函数是用来注册数据库驱动的,当第三方开发者开发数据库驱动时,都会实现 init() 函数,在该函数中会调用这个 Register() 函数来完成驱动的注册,其函数的声明如下:

func Register(name string, driver driver.Driver)

导入包使用 import _ "github.com/go-sql-driver/mysql" ,前面的 _ 作用时不需要把该包都导进来,只执行包的 init() 函数,MySQL 驱动正是通过这种方式注册到 ”database/sql”

、init() 函数通过调用 Register() 函数将 MySQL 驱动添加到 sql.drivers ,第三方数据库驱动都是通过调用这个函数来注册自己的数据库驱动名称以及相应的 driver 实现,在 database/sql 内部通过一个 map 来存储用户定义的相应驱动,其形式如下:

var drivers = make(map[string]driver.Driver)

driver.Driver 接口

init() 函数通过 Register() 函数将 MySQL 驱动添加到 sql.drivers (类型:make(map[string]driver.Driver))中, MySQLDriver 实现了 driver.Driver 接口,Driver 是一个数据库驱动的接口,其定义了一个 Open(name string) 方法返回一个数据库的 Conn ,该接口的定义如下:

//database/sql/driver/driver.go type Driver interface { Open(name string) (Conn, error) }

driver.Conn 接口

Conn 是一个数据库连接的接口定义,定义了一系列方法,这个 Conn 只能应用在一个 goroutine 里面,不能使用在多个 goroutine 里面,该接口的定义如下:

type Conn interface { Prepare(query string) (Stmt, error) Close() error Begin() (Tx, error) }

Prepare() 函数返回与当前连接相关的执行 SQL 语句的准备状态,可以进行查询、删除等操作。

Close() 函数关闭当前的连接,执行释放连接拥有的资源等清理工作。因为驱动实现了 database/sql 里面建议的 conn pool ,所以不用再去实现缓存 Conn 之类的,否则容易引起问题。

Begin() 函数返回一个代表事务处理的 Tx ,通过它可以进行查询、更新或者对事务进行回滚、递交等操作。