开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情 这也是第31篇文章
前言
连接数据库并对数据进行增、删、查、改是后端的基础任务,俗称crud。 之前曾经了解过JDBC的使用所以这次看Go相关的代码就比较顺手了。
官方文档说,go-sql-driver是为MySQL设计的,所以不知道用于别的数据库时是否需要稍作修改,之后如果有用到的需要再细看了。
参考资料
- 掘金课程——字节内部课——后端
- github.com/go-sql-driv…
准备工作
- 安装go-sql驱动 在项目目录下输入:
go get -u github.com/go-sql-driver/mysql
之后可以看到go-sql-driver 出现在了拓展库中
- 在数据库中找一个表 我仿照示例代码建立一个名为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)是我最初建表时顺便插入的)
程序返回结果:
至此,插入和查询操作都基本熟悉了,明天打算熟悉一下gorm这个框架。