Go实战(篇一)数据库相关操作
Posted 是轩哲啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go实战(篇一)数据库相关操作相关的知识,希望对你有一定的参考价值。
数据库相关操作
在信息时代,数据库技术成为软件设计与开发必不可少一部分。下面对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的介绍了,暂时先写这么多,后面也会进行完善。
你知道的越多,你不知道的就越多,人才们的 【三连】 就是我创作的最大动力,我们下期见!
注:如果本篇博客有任何错误和建议,欢迎人才们留言,你快说句话啊!
原文链接:Go实战(篇一)数据库相关操作_Go_轩哲驿站
以上是关于Go实战(篇一)数据库相关操作的主要内容,如果未能解决你的问题,请参考以下文章