数据库相关操作
在信息时代,数据库技术成为软件设计与开发必不可少一部分。下面对GO连接数据库做出详细介绍。
1 配置环境
选择环境如下:
操作系统:Ubuntu 22.04LTS x64
sdk版本:go version go1.18.4 linux/amd64
在官网下载sdk,下载完成后解压到指定目录,在这里不对sdk的安装再做赘述,可参考文章如下文章:
在这里需要额外添加一条环境变量,所有的环境变量如下:
# 指定sdk的目录 export GOROOT=/opt/sdk/go # 指定gopath的目录,用来表明你写的go项目的存放路径 export GOPATH=/opt/sdk/go/gopath export PATH=$PATH:$GOROOT/bin # 设置GOPROXY的代理 export GOPROXY=https://goproxy.cn,direct
在/etc/profile文件添加以上内容后,输入命令:
# 重载环境变量,让新添加的内容生效 source /etc/profile
检查配置是否生效,需要输入go version,显示安装的sdk版本表明系统已成功部署Go语言开发环境;输入go env,相应的变量有对应的值,打印的内容如下:
GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/userName/.cache/go-build" GOENV="/home/userName/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/opt/sdk/go/gopath/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" #已载入GOPATH环境变量 GOPATH="/opt/sdk/go/gopath" GOPRIVATE="" #已载入GOPOXY环境变量 GOPROXY="" #已载入GOROOT环境变量 GOROOT="/opt/sdk/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/opt/sdk/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.18.4" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build4047345889=/tmp/go-build -gno-record-gcc-switches"
2 启动Goland
完成环境配置后,启动Goland,在这里不对Goland的安装和激活进行详细介绍,可以通过Ubuntu的软件商城快速安装。(中文可以在File->Settings->Plugins->Marketplace中搜索Chinese,选中搜索结果中的”Chinese(Simplified)Language Pack/中文语言包“进行安装)
新建Go项目,确定项目信息后,点击创建。创建的目录结构如下:
├─awesomeProject │ ├─main │ ├─toolkit │ │ ├─sqlhelper │ ├─go.mod | ├─项目名称 │ ├─main包,一般有且只有一个,放置main.go │ ├─toolkit包,一般将项目内的文件夹称为包 │ │ ├─sqlhelper包,处理sql操作的集合 │ ├─go.mod一个Modules,是相关Go包的集合 |
3 添加依赖
这里的数据库选择的是MySQL,安装的依赖包是github.com/go-sql-driver/mysql。在终端输入如下命令:
#可以优先切换权限使用su命令,避免创建目录时出现权限不足 #出现“su 认证失败”,是因为root用户默认是锁定的,输入“sudo passwd root”修改密码 go get github.com/go-sql-driver/mysql # 可能需要的操作 # 生成 mod 文件(切换到模块根目录) go mod init modulename # 清理无效依赖,增加缺失依赖 go mod tidy
4 编写代码
在sqlhelper包创建command.go,用于统一管理sql命令;在main包创建main.go,作为程序的入口。
以下代码仅作为展示,部分代码没有按照规范进行缩进、命名和重用,数据库也没有做出约束,command.go的代码如下:
package sqlhelper import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "time" ) const ( USERNAME = "" PASSWORD = "" NETWORK = "tcp" SERVER = "127.0.0.1" PORT = 3306 DATABASE = "" ) type FileInfo struct { fileID int fileName string fileSize string fileSource string fileState string filePayment int fileDownloads int userID int created string updated string } func Open() *sql.DB { conn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE) fmt.Println("conn:", conn) db, err := sql.Open("mysql", conn) if err != nil { fmt.Println("connection to mysql fault:", err) return db } db.SetConnMaxLifetime(100 * time.Second) db.SetMaxOpenConns(100) return db } func CreateTable(db *sql.DB) { if db == nil { fmt.Println("db is not init or open") return } sql := "CREATE TABLE NewTable (" + "userNum varchar(10) NULL," + "userPasswd varchar(32) NULL," + "created TIMESTAMP DEFAULT CURRENT_TIMESTAMP," + "updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP )" + "ENGINE=InnoDB " + "DEFAULT CHARSET=gbk " + "COLLATE=gbk_chinese_ci;" _, err := db.Exec(sql) if err != nil { fmt.Println("create table failed:", err) return } fmt.Println("create table successful !") } func DeleteTable(db *sql.DB) { if db == nil { fmt.Println("db is not init or open") return } sql := "DROP TABLE NewTable;" _, err := db.Query(sql) if err != nil { fmt.Println("delete table failed:", err) return } fmt.Println("delete table successful !") } func QueryUser(db *sql.DB) { if db == nil { fmt.Println("db is not init or open") return } sql := "select userNum,userPasswd from NewTable" rows, err := db.Query(sql) if err != nil { fmt.Println("query failed:", err) return } for rows.Next() { var userNum, userPasswd string err = rows.Scan(&userNum, &userPasswd) //err = rows.Scan(&infos.fileID, &infos.fileName, &infos.fileSize, &infos.fileSource, &infos.filePayment, &infos.fileDownloads, &infos.userID, &infos.created, &infos.updated) if err != nil { fmt.Println("scan failed:", err) } fmt.Println(userNum, userPasswd) } } func InsertUser(db *sql.DB) { if db == nil { fmt.Println("db is not init or open") return } sql := "INSERT INTO NewTable" + "(userNum, userPasswd, created, updated)" + "VALUES('0123456789', '0123456789', NULL, NULL);" _, err := db.Exec(sql) if err != nil { fmt.Println("insert failed:", err) return } fmt.Println("insert a date successful !") data := []map[string]string{ {"userNum": "test1", "userPasswd": "0123456789"}, {"userNum": "test2", "userPasswd": "0123456789"}, {"userNum": "test3", "userPasswd": "0123456789"}, {"userNum": "test4", "userPasswd": "0123456789"}, {"userNum": "test5", "userPasswd": "0123456789"}, } //insert more data var sqls string for i := range data { sqls = "INSERT INTO NewTable" + "(userNum, userPasswd, created, updated) VALUES(" + "'" + data[i]["userNum"] + "', " + "'" + data[i]["userPasswd"] + "', " + "NULL, NULL);" //fmt.Println(data[i]["userNum"], data[i]["userPasswd"]) _, err = db.Exec(sqls) if err != nil { fmt.Println("insert data fault:", err) return } } fmt.Println("insert data successful !") } func UpdateUser(db *sql.DB) { if db == nil { fmt.Println("db is not init or open") return } sql := "UPDATE NewTable set userNum='newName' where userNum='test4';" _, err := db.Exec(sql) if err != nil { fmt.Println("update fault:", err) return } fmt.Println("update date successful !") } func DeleteUser(db *sql.DB) { if db == nil { fmt.Println("db is not init or open") return } sql := "DELETE FROM NewTable where userNum='0123456789';" _, err := db.Exec(sql) if err != nil { fmt.Println("delete fault:", err) return } fmt.Println("delete date successful !") }
在main函数中进行调用,代码如下:
package main import ( "database/sql" "fmt" "awesomeProject/toolkit/sqlhelper" ) func main() { fmt.Println("open sql connection") var DB *sql.DB DB = sqlhelper.Open() sqlhelper.CreateTable(DB) sqlhelper.InsertUser(DB) sqlhelper.QueryUser(DB) sqlhelper.UpdateUser(DB) sqlhelper.DeleteUser(DB) sqlhelper.DeleteTable(DB) defer DB.Close() }
5 可能会遇到的问题
1)数据库连接信息正确,出现Connection refused
检查mysqld服务是否正常启动
# 检查mysqld服务状态 service mysqld status # 启动mysqld服务 service mysqld start # 关闭mysqld服务 service mysqld stop
写在最后
以上就是Go语言操作MySQL的介绍了,暂时先写这么多,后面也会进行完善。
你知道的越多,你不知道的就越多,人才们的 【三连】 就是我创作的最大动力,我们下期见!
注:如果本篇博客有任何错误和建议,欢迎人才们留言,你快说句话啊!