GO - DATABASE
写在前面
GO关于数据库的用法
自己开发用的是mariadb加dbeaver,开源好用。
驱动
正常需要sql.Register()进行注册,这个驱动需要实现了driver.Driver接口。但是驱动引入的时候会进行自我注册,注册代码位于这个包的init函数里面。每个包的init都会自动调用。引入包的时候,把该包的名设置为下划线_,代表我们不会直接使用数据库驱动(只需要它起副作用),主要还是使用database/sql
go
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
}
Open()
不会连接数据库也不会验证参数,只是一个模版,在实际运行的时候才懒设置真正的连接。sql.DB是不需要人为关闭的,因为它只是用来处理数据库,而非真正的连接。这个抽象包含了数据库连接的池并进行维护。
func (*DB) PingContext
用来验证与数据库的连接是否仍然有效,如有必要则建立一个连接。函数参数为一个Context类型参数,这个类型携带截止时间、取消信号和其它请求范围的值,并且可以横跨API边界和进程。
go
db, err := sql.Open("mysql", "root:123456@/gotest")
if err != nil {
fmt.Println(err)
}
ctx := context.Background()
err = db.PingContext(ctx)
if err != nil {
fmt.Println(err)
}
fmt.Println("database connected!")
context.Background()
会创建一个非nil的空Context,它不会被取消,没有值,没有截止时间。通常用在main函数、初始化或测试,作为传入请求的顶级Context。
查询
- Query
- QueryRow
- QueryContext
- QueryRowContext
go
// 示例方法
err = db.QueryRow("SELECT Id, Name, Status, Level, [Order] FROM abc.App WHERE Id=@Id", sql.Named("Id", id)).Scan(&a.ID, &a.name, &a.status, &a.level, &a.order)
增删改
INFO
不想学了,我感觉不如看文档,不同驱动之间也不知道有没有问题