Go实战(篇一)数据库相关操作

Posted 是轩哲啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go实战(篇一)数据库相关操作相关的知识,希望对你有一定的参考价值。

数据库相关操作

在信息时代,数据库技术成为软件设计与开发必不可少一部分。下面对GO连接数据库做出详细介绍。

1 配置环境

选择环境如下:

  1. 操作系统:Ubuntu 22.04LTS x64
  2. 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实战(篇一)数据库相关操作的主要内容,如果未能解决你的问题,请参考以下文章

Go语言性能剖析利器--pprof实战

Java EE 学习目标及相关问题

GO语言实战之类型的本质

GO语言实战之类型的本质

实战篇一 python常用模块和库介绍

Go 言 Go 语,一文看懂 Go 语言文件操作