Your First database/sql Program
本节以完整功能的Go程序的形式快速介绍数据库/ sql的主要功能! 在开始之前,请确保你可以访问MySQL数据库,因为我们将在本书的示例中使用MySQL。如果你没有适合测试的MySQL实例,你可以使用MySQL Sandbox实用程序在几秒钟内获得一个。【书中给的地址是这个,我访问的时候连不上,不知道是不是被墙了。如果你用过docker,用docker启动一个mysql也是非常迅速的,实在不行,就去官网下载一个】
创建一个文件,命名hello_mysql.go,你也可以下载源码Demo。你可能需要根据需要调整连接参数以连接到测试数据库。另请注意,该示例假定存在默认测试数据库,并且你的用户具有以下权限,我这里是在本机启动了一个test数据库。
package main
import (
"database/sql"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
connectionString := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
"root",
"123456",
"localhost",
"3306",
"test")
db, err := sql.Open("mysql", connectionString)
if err != nil {
log.Fatal(err)
}
defer db.Close()
_, err = db.Exec(
"CREATE TABLE IF NOT EXISTS test.hello(world varchar(50))")
if err != nil {
log.Fatal(err)
}
res, err := db.Exec(
"INSERT INTO test.hello(world) VALUES('hello world!')")
if err != nil {
log.Fatal(err)
}
rowCount, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
log.Printf("inserted %d rows", rowCount)
rows, err := db.Query("SELECT * FROM test.hello")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var s string
err = rows.Scan(&s)
if err != nil {
log.Fatal(err)
}
log.Printf("found row containing %q", s)
}
rows.Close()
}
使用go run hello_mysql.go运行新的Go程序。多次运行是安全的。运行之后,你可以看到如下所示的输出,它会继续在表中插入行:
恭喜!你完成了第一个使用Go与MySQL服务器交互的程序。 你可能会感到惊讶的是,你刚刚运行的代码并不是某种过于简化,愚蠢的例子。 它与你在高负载下在生产系统中使用的代码非常相似,包括错误处理。 我们将在本书的更多部分中探讨这些代码的大部分内容,并详细了解它的作用。 现在,我们只提几个点:
- 导入了"database/sql"并且使用了一种应用于mysql数据库的驱动程序(driver)。
- 创建了sql.DB,并且调用了sql.Open();传递了驱动程序名称和连接字符串。
- 使用Exec()创建表并且插入数据行,并且检查结果。
- 使用Query()查表数据,使用rows.Next()迭代结果集,并且使用rows.Scan()将当前行的字段内容赋值给变量。
- 在结束时使用.Close()关闭数据库,清理资源。
让我们深入研究这些点的细节。从sql.DB本身开始,看看它是什么东西,又是怎么工作的。
网友评论