【Go基础学习】数据库连接示例代码学习

102 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情 这也是第31篇文章

前言

连接数据库并对数据进行增、删、查、改是后端的基础任务,俗称crud。 之前曾经了解过JDBC的使用所以这次看Go相关的代码就比较顺手了。

官方文档说,go-sql-driver是为MySQL设计的,所以不知道用于别的数据库时是否需要稍作修改,之后如果有用到的需要再细看了。

参考资料

准备工作

  • 安装go-sql驱动 在项目目录下输入:
 go get -u github.com/go-sql-driver/mysql

之后可以看到go-sql-driver 出现在了拓展库中

image.png

  • 在数据库中找一个表 我仿照示例代码建立一个名为squarenum的表,它有两个字段:number和squareNumber

过程

  • 从官方文档的描述可知,Go的这个驱动包在后台管理着一个 连接池 ,sql.db()不是一个连接,sql.Open()也不是直接打开一个连接。
  • 还分“准备”和“执行”两步
  • 全部结束后要及时关闭“连接”

注意事项:前面文章提到的,业务代码尽量用Error,不用Panic

代码尝试


package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
)

func main() {
   db, err := sql.Open("MySQL", "user:password@/databasename")
   //这里填写自己数据库的配置信息
   if err != nil {
      fmt.Errorf("open fail %w ", err)
   }

   // Open doesn't open a connection. Validate DSN data:
   err = db.Ping()
   if err != nil {
      fmt.Errorf("ping fail %w ", err)
   }
   defer db.Close()

   // Prepare statement for inserting data
   stmtIns, err := db.Prepare("INSERT INTO squareNum VALUES( ?, ? )") // ? = placeholder
   if err != nil {
      fmt.Errorf("Prepare statement for inserting data failed:%w ", err)
   }
   defer stmtIns.Close() // Close the statement when we leave main() / the program terminates

   // Prepare statement for reading data
   stmtOut, err := db.Prepare("SELECT squareNumber FROM squarenum WHERE number = ?")
   if err != nil {
      fmt.Errorf("Prepare statement for reading data failed:%w ", err)
   }
   defer stmtOut.Close()

//这里我稍微改了一下,因为中途报错,显示是这里有问题,内存超限,我还以为真是这几行代码有问题,最后才发现是前面配置信息写错了,但是由于前面的代码没有真正建立连接,所以也没有抛出异常

   var i int
   // Insert square numbers for 0-24 in the database
   for i = 1; i < 25; i++ {
      _, err = stmtIns.Exec(i, i*i) // Insert tuples (i, i^2)
      if err != nil {
         fmt.Errorf("insert square num failed:%w ", err)
      }
   }

   var squarenum int // we "scan" the result in here

   // Query the square-number of 13
   err = stmtOut.QueryRow(13).Scan(&squarenum) // WHERE number = 13
   if err != nil {
      fmt.Errorf("querying square-number of 13 failed:%w ", err)
   }
   fmt.Printf("The square number of 13 is: %d", squarenum)

   // Query another number 1 maybe?
   err = stmtOut.QueryRow(1).Scan(&squarenum) // WHERE number = 1
   if err != nil {
      panic(err.Error()) // proper error handling instead of panic in your app
   }
   fmt.Printf("The square number of 1 is: %d", squarenum)
}

结果

可以看到数据插入成功((13,15)是我最初建表时顺便插入的) image.png 程序返回结果:

image.png

至此,插入和查询操作都基本熟悉了,明天打算熟悉一下gorm这个框架。