go操作数据库(1) | 青训营笔记

43 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

一、前言:今天遇到的问题

今天遇到的问题很新手了,就是使用gin框架,爆红。

image.png

解决步骤如下:

1、首先我们要下载相关依赖:

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

发现仍然爆红,于是考虑创建一个.mod文件

go mod init mysql_demo

然后再输入刚刚下载依赖的指令 发现go.mod文件里面,同样爆红

image.png

因为我们还没有开启go modules, 因此我们点开settings - Go - Go Modules

image.png

现在代码不暴红了

image.png

二、今天学习内容如下,Go操作常见数据库

1、Go连接MySql

 package main
 ​
 import (
     "database/sql"
     "fmt"
     _ "github.com/go-sql-driver/mysql"
 )
 ​
 func main() {
     // DSN: 从左到右依次是数据库的用户名,密码,端口,数据库名称
     // "user:password@tcp(127.0.0.1:3306)/dbname"
     dsn := "root:1314520syhSYH@tcp(127.0.0.1:3306)/mysql"
  
     // Open打开一个dirverName指定的数据库
     db, err := sql.Open("mysql", dsn)
     if err != nil {
         panic(err)
     }
     defer db.Close() // 注意这行代码要写在上面err判断的下面
     
     /*
     sql.Open并不会立即建立一个数据库的网络连接, 也不会对数据库链接参数的合法性做检验, 它仅仅是初始化一个sql.DB对象. 当真正进行第一次数据库查询操作时, 此时才会真正建立网络连接
     func Open(driverName, dataSourceName string) (*DB, error)
     */ 
     
     
     // 尝试和数据库连接,校验dns是否正确。之前的open,会帮我们校验dns格式是否正确
     err = db.Ping()
     if err != nil {
         fmt.Printf("连接失败啦, err = %v\n", err)
         return
     }
     fmt.Println("成功了")
 }
 ​

image.png

上面的代码我们都放在了一个main函数里面,实际上在模块化的代码,我们应该用一个函数来作为数据库的初始化。

我会定义一个全局的数据库db对象,然后调用init函数去初始化。

 package main
 ​
 import (
     "database/sql"
     "fmt"
     _ "github.com/go-sql-driver/mysql"
 )
 ​
 var db *sql.DB
 ​
 func initMySql() (err error) {
     dsn := "root:1314520syhSYH@tcp(127.0.0.1:3306)/mysql"
     // 由于我们开的全局db,因此就不需要:=操作了
     db, err = sql.Open("mysql", dsn)
     if err != nil {
         panic(err)
     }
     err = db.Ping()
     if err != nil {
         fmt.Printf("连接失败啦, err = %v\n", err)
         return
     }
     return
 }
 ​
 func main() {
     if err := initMySql(); err != nil {
         fmt.Printf("连接失败啦, err = %v\n", err)
     }
     defer db.Close() // 注意这行代码要写在上面err判断的下面
     fmt.Println("成功了")
     // 然后我的db.xx 就可以在后续进行使用了
 }
 ​

然后我们对数据库进行一些基础的配置 注意,下面的配置需要根据实际业务来决定

SetMaxOpenConns

 func (db *DB) SetMaxOpenConns(n int)

SetMaxOpenConns设置与数据库建立连接的最大数目。 如果n大于0且小于最大闲置连接数,会将最大闲置连接数减小到匹配最大开启连接数的限制。 如果n<=0,不会限制最大开启连接数,默认为0(无限制)。

SetMaxIdleConns

 func (db *DB) SetMaxIdleConns(n int)

SetMaxIdleConns设置连接池中的最大闲置连接数。 如果n大于最大开启连接数,则新的最大闲置连接数会减小到匹配最大开启连接数的限制。 如果n<=0,不会保留闲置连接。

所以我们在刚刚initMySql函数里面补充下面几行:

 db.SetConnMaxLifetime(time.Second * 10) // 连接存活的最长时间
 db.SetMaxOpenConns(200)                 // 最大连接数
 db.SetMaxIdleConns(10)                  // 最大空闲连接数