Go语言操作MySQL数据库完整示例与细节解析
Go语言操作关系型数据库主要依赖标准库 database/sql 配合具体的数据库驱动(如 github.com/go-sql-driver/mysql)。本示例展示了从建立连接、执行参数化插入到查询遍历结果的完整流程,重点解析了Go中与日期时间处理相关的特殊语法及注意事项。
开发准备与环境配置
在开始编写代码前,需要确保本地已安装 Go 语言环境并配置好 GOPATH 或 Go Modules。本项目需要引入两个核心组件:
- 标准库:
database/sql,提供数据库操作的接口规范。 - 第三方驱动:
github.com/go-sql-driver/mysql,实现 MySQL 协议的驱动。
测试用表结构如下,用于验证插入和查询功能:
create table t(
id int primary key auto_increment,
name varchar(20) not null,
ts timestamp
);
建立数据库连接
在 main 函数中,首先需要获取数据库连接句柄。Go 使用 sql.Open 打开数据源名称(DSN)。
db, err := sql.Open("mysql", "xx:xx@tcp(127.0.0.1:3306)/mvbox?charset=utf8")
if err != nil {
log.Fatalf("Open database error: %s\n", err)
}
defer db.Close()
注意:此时并未真正建立网络连接。为了确保连接可用,必须调用 Ping 方法进行验证:
err = db.Ping()
if err != nil {
log.Fatal(err)
}
执行插入操作与时间处理
数据库操作推荐使用 Prepare 语句以实现参数化查询,防止 SQL 注入。在 Go 中,占位符为 ?(MySQL 驱动自动转换)。
第1步:预处理插入语句
目的:编译 SQL 语句以提高后续执行效率。
复制代码 代码如下:
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
func insert(db *sql.DB) {
// 预处理 SQL,注意 Go 中使用 "?" 作为占位符
stmt, err := db.Prepare("insert into t(name,ts) values(?,?)")
defer stmt.Close()
if err != nil {
log.Println(err)
return
}
// 关键点:Go 的时间解析基准时间为 "2006-01-02 15:04:05"
ts, _ := time.Parse("2006-01-02 15:04:05", "2014-08-28 15:04:00")
// 执行插入
_, err = stmt.Exec("edmond", ts)
if err != nil {
log.Println("Insert error:", err)
}
}
时间处理说明:Java等语言拥有流畅的日期API,而Go默认解析时间字符串依赖于特定的锚定时间 Mon Jan 2 15:04:05 MST 2006。在代码中需严格遵循此格式定义时间布局。
第2步:查询数据与结果遍历
目的:从数据库中读取记录并映射到Go变量。
- 发起查询:使用
db.Query返回行集合。 - 安全扫描:通过循环调用
rows.Scan将列数据赋值给 Go 变量。
rows, err := db.Query("select id,name,ts from t where id>?", 1)
if err != nil {
log.Println(err)
}
defer rows.Close()
var id int
var name string
var ts string
// 遍历每一行
for rows.Next() {
err := rows.Scan(&id, &name, &ts)
if err != nil {
log.Fatal(err)
}
log.Println(id, name, ts)
}
// 检查遍历过程中的错误
err = rows.Err()
if err != nil {
log.Fatal(err)
}
总结
通过以上步骤,我们完成了 Go 语言连接 MySQL 的核心流程。掌握 database/sql 的基本用法、正确配置 DSN、处理时间戳格式以及规范的资源释放(defer close),是构建稳定 Go 后端应用的基础。以上就是Go语言操作MySQL数据库完整示例与细节解析的详细内容,更多关于Go数据库编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













