前言
对于外部数据库的依赖,是每种高级编程语言绕不开的话题。像Java的JDBC、Python的pymysql,都为连接数据提供了良好的解决方案。初学go,当然也要去了解一下go是如何对MySQL的连接进行封装的。
数据表
在上一篇JDBC和ORM的文章中,建了一个people表。本着不浪费就浪费的原则,这里还是用这张表来做数据库的CURD操作。
people表里面一共三个字段:name、age、phone,共三条数据。
CRUD
同样,和Java、Python一样,想要连接数据库需要安装依赖(驱动)。go需要安装github.com/go-sql-driver/mysql模块。
go get github.com/go-sql-driver/mysql
这个就相当于JBDC中MySQL的Driver驱动。然后就开始进行CRUD操作。这里先看JDBC的流程图。
C(增)
create,指向数据库中添加新的数据记录。在关系型数据库中,通过SQL的INSERT来实现。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 设置数据库连接信息
dsn := "root:password@tcp(175.27.xxx.xxx:3306)/test"
// 连接数据库
db, err := sql.Open("mysql", dsn)
if err != nil {
fmt.Println(err)
}
defer db.Close()
// 检查数据库连接是否正常
err = db.Ping()
if err != nil {
fmt.Println(err)
}
// 插入数据
stmt, err := db.Prepare("INSERT INTO people(name, age, phone) VALUES(?, ?, ?)")
if err != nil {
fmt.Println(err)
}
defer stmt.Close()
// 执行插入操作
result, err := stmt.Exec("Jerry", 25, "12345678900")
if err != nil {
fmt.Println(err)
}
// 输出插入结果
lastInsertID, err := result.LastInsertId()
if err != nil {
fmt.Println(err)
}
fmt.Println("插入成功,新记录的ID为:", lastInsertID)
}
这个流程和JDBC如出一辙,sql.Open加载MySQL驱动,并创建一个连接(connection),然后获取执行sql的对象(statement)来执行插入操作。运行程序,结果如下:
在people表中新增了一条Jerry的记录。
R(读取)
Read,指从数据库中检索数据记录。这是通过SQL的SELECT语句来实现的。可以从整个表中获取数据,也可以根据特定的条件来筛选数据。加载驱动、获取连接操作和Insert如出一辙,这里只需要替换成Select操作即可。
// 执行查询命令
rows, err := db.Query("SELECT name, age, phone FROM people")
if err != nil {
fmt.Println(err)
}
defer rows.Close()
// 遍历查询结果
var (
name string
age int
phone string
)
for rows.Next() {
err := rows.Scan(&name, &age, &phone)
if err != nil {
fmt.Println(err)
}
fmt.Println(name, age, phone)
}
执行程序,全量查询整个表。
U(更新)
Update,指更新数据库中现有的数据记录。这是通过SQL的UPDATE语句来实现的。更新通常需要条件来定位需要更新的记录,否则就会更新全表数据。
stmt, err := db.Prepare("UPDATE people SET age=? WHERE name=?")
if err != nil {
fmt.Println(err)
}
defer stmt.Close()
// 更新操作
_, err = stmt.Exec(100, "Tom")
if err != nil {
fmt.Println(err)
}
fmt.Println("数据更新成功")
执行程序,可以看到Tom已经从20岁变成了100岁。Time goes by,感叹岁月无情。
D(删除)
Delete,指从数据库中删除数据记录。这是通过SQL的DELETE语句来实现的。删除操作一般需要指定条件,否则就会删除全表数据,就和truncate功能相同了。
stmt, err := db.Prepare("DELETE FROM people WHERE name = ?")
if err != nil {
fmt.Println(err)
}
defer stmt.Close()
// 执行删除操作
_, err = stmt.Exec("Jerry")
if err != nil {
fmt.Println(err)
}
fmt.Println("数据删除成功")
通过where指定条件,删除name为Jerry的数据。执行程序,结果如下。
结语
作为一名go的初学者,从Java的JDBC的角度来学习go更容易上手。同时在学习go连接MySQL的过程中,又认识了defer关键字,就这样吧。