Go语言(Golang)数据库编程

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

Go 数据库编程

一、连接数据库

准备连接到数据库


  • 要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。
  • sql.Open()

    • 数据库驱动的名称
    • 数据源名称
    • 得到一个指向 sql.DB 这个 struct 的指针

  • sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会自动的创建和释放这些连接

    • 它对于多个 goroutine 并发的使用是安全的

  1. package main
  2. import (
  3.   "context"
  4.   "database/sql"
  5.   "fmt"
  6.   "log"
  7.   
  8.   _ "github.com/denisenkom/go-mssqldb"
  9. )
  10. var db *sql.DB
  11. const (
  12.   server = "xxxx.database.windows.net"
  13.   port = 1433
  14.   user = "xxxxx"
  15.   password = "xxxxx"
  16.   database = "go-db"
  17. )
  18. func main() {
  19.   connStr := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;",
  20.                         server, user, password, port, database)
  21.   
  22.   db, err := sql.Open("sqlserver", connStr)
  23.   if err != nil {
  24.     log.Fataln(err.Error())
  25.   }
  26.   
  27.   ctx := context.Background()
  28.   
  29.   err = db.PingContext(ctx)
  30.   if err != nil {
  31.     log.Fataln(err.Error())
  32.   }
  33.   
  34.   fmt.Println("Connected!")
  35. }
复制代码
Note


  • Open() 函数并不会连接数据库,甚至不会验证其参数。它只是把后续连接到数据库所必需的 structs 给设置好了
  • 而真正的连接是在被需要的时候才进行懒设置的
  • sql.DB 不需要进行关闭(当然你想关闭也是可以的)
  • 它就是用来处理数据库的,而不是实际的连接
  • 这个抽象包含了数据库连接的池,而且会对此进行维护
  • 在使用 sql.DB 的时候,可以定义它的全局变量进行使用,也可以将它传递到函数/方法里。
如何获得驱动


  • 正常的做法是使用 sql.Register() 函数、数据库驱动的名称和一个实现了 driver.Driver 接口的 struct,来注册数据库的驱动。例如:

    • sql.Register("sqlserver", &drv{})

  • 但是我们之前的例子却没写这句话,为什么?

    • 因为 Sql Server 的驱动,是在这个包被引入的时候进行了自我注册

驱动自动注册


  • 当 go-mssqldb 包被引入的时候,它的 init 函数将会运行并进行自我注册(在 Go 语言里,每个包的 init 函数都会在自动的调用)
  • 在引入 go-mssqldb 包的时候,把该包的名设置为下划线 _,这是因为我们不直接使用数据库驱动(只需要它的”副作用“),我们只使用 database/sql

    • 这样,如果未来升级驱动,也无需改变代码

  • Go 语言没有提供官方的数据库驱动,所有的数据库驱动都是第三方驱动,但是它们都遵循 sql.driver 包里面定义的接口
安装数据库驱动


  • 这是安装 Microsoft SQL Server 数据库驱动的例子:
  • go get github.com/denisenkom/go-mssqldb
func(*DB) PingContext


  • 上例中的 db.PingContext() 函数是用来验证与数据库的连接是否仍然有效,如有必要则建立一个连接。
  • 这个函数需要一个 Context (上下文)类型的参数,这种类型可以携带截止时间、取消信号和其它请求范围的值,并且可以横跨 API 边界和进程。
  • 上例中,创建 context 使用的是 context.Background() 函数。该函数返回一个非 nil 的空 Context。它不会被取消,它没有值,没有截止时间。
  • 它通常用在 main 函数、初始化或测试中,作为传入请求的顶级 Context。
Exercises


  • 使用 PostgreSQL 建立数据库,使用 Go 语言进行连接,并 Ping 一下。
  • 使用 SQLite 建立数据库,使用 Go 语言进行连接,并 Ping 一下。
连接MySQL

https://github.com/go-sql-driver/mysql
  1. go get -u github.com/go-sql-driver/mysql
复制代码
创建目录
[code]➜ mcd go_sql_demoCode/go/go_sql_demo via
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表