Skip to content

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 alt textalt text
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

不想学了,我感觉不如看文档,不同驱动之间也不知道有没有问题