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的介绍了,暂时先写这么多,后面也会进行完善。

你知道的越多,你不知道的就越多,人才们的 【三连】 就是我创作的最大动力,我们下期见!

注:如果本篇博客有任何错误和建议,欢迎人才们留言,你快说句话啊!

#转载请注明出处!
快来制作你的简历吧 ,请猛戳这里→点击在线制作
宝塔服务器面板,一键全能部署及管理,送你3188元礼包。请猛戳这里→点我领取

本文标题:《Go实战(篇一)数据库相关操作》作者:xuanzhe
原文链接:https://blog.xuanzhe.club/?id=66
特别注明外均为原创,转载请注明。

分享到微信

扫描二维码

可在微信查看或分享至朋友圈。

相关文章

发表评论:
验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

你好,朋友

真是美好的一天!

访客信息

  • IP: 3.144.28.50
  • 地点: United StatesOhioDublin

标签列表

站点信息

  • 文章总数:69
  • 页面总数:2
  • 分类总数:19
  • 标签总数:34
  • 评论总数:7
  • 浏览总数:147010
您好,欢迎到访网站!
忘记密码

网站分类

文章归档

歌曲 - 歌手
0:00