龙空技术网

go语言访问数据库

程序员TOM 87

前言:

此时小伙伴们对“go语言的数据库”大约比较着重,我们都需要分析一些“go语言的数据库”的相关文章。那么小编在网络上收集了一些对于“go语言的数据库””的相关文章,希望看官们能喜欢,小伙伴们一起来了解一下吧!

上一章,讲解了怎么样研发出一个取名系统后台逻辑部分,并利用控制台回合输出自己满意的名字。

这一章,主要讲解怎么样利用go语言访问mysql数据库。

mysql数据库搭建

官网地址:

官网图

点击download

下滑,找到MySQL Community (GPL) Downloads 点击

下载link

选择需要下载的服务MySQL Community Server

mysql server

下载安装包

download下载

下载完之后,就可以跟安装软件一样去安装了。

创建数据库表

我们利用go语言访问我们的数据库。

创建表语句:

CREATE TABLE `test` (  `id` int NOT NULL,  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

插入数据:

go代码访问mysql数据库

我们要引入mysql操作包,正常直接go get -u github.com/go-sql-driver/mysql,可能会报错,

导致下载不了

报错:go: module github.com/go-sql-driver/mysql: Get ";: dial tcp 172.217.163.49:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

这里我们要设置代理服务:goproxy.cn

PS D:\work\workspace\go\name-generate\db> go env -w GO111MODULE=on

PS D:\work\workspace\go\name-generate\db> go env -w GOPROXY=

goproxy.cn是国内一个流行的Go模块代理,direct表示如果模块代理服务器无法访问时,Go将直接访问模块存储库。

设置完成后,你可以正常使用go get来获取依赖

PS D:\work\workspace\go\name-generate\db> go get -u github.com/go-sql-driver/mysql

go: downloading github.com/go-sql-driver/mysql v1.8.1

go: downloading filippo.io/edwards25519 v1.1.0

go: added filippo.io/edwards25519 v1.1.0

go: added github.com/go-sql-driver/mysql v1.8.1

命令行出现这个,就代表获取mysql操作包成功了。

编写go代码,操作数据库,获取数据库中的数据,还是在name-generate的项目中创建目录db,然后创建db_opt.go文件实例,如下图:

数据库操作图

数据库连接配置信息编写:

dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local","root", "root", "localhost", 3306, "test002")

数据库配置信息图

tips:这个一定要调整好属于自己的配置信息

查询编号ID=4的数据,【rows, err := dbOperator.QueryDemo(db, "SELECT * FROM test WHERE id = ?", 4)】如下图:

获取数据

在db目录的vs终端,执行go run . 命令,查询刚才添加的数据,如下图:

查询结果展示

整个db_opt.go的源代码:

package main import (    "database/sql"    "fmt"    _ "github.com/go-sql-driver/mysql"    "log") // 定义数据库配置结构体type DBConfig struct {    Host     string    Port     int    User     string    Password string    DBName   string}//定义一个用户类,包含id和nametype User struct {    ID   int    Name string} // 定义数据库操作接口type DBOperator interface {    OpenConnection() (*sql.DB, error)    CloseConnection(db *sql.DB) error    QueryRowDemo(db *sql.DB, query string, args ...interface{}) (*sql.Row, error)    QueryDemo(db *sql.DB, query string, args ...interface{}) (*sql.Rows, error)    ExecDemo(db *sql.DB, query string, args ...interface{}) (sql.Result, error)} // 实现数据库操作接口type MySQLDB struct{} func (mysql *MySQLDB) OpenConnection() (*sql.DB, error) {    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",        "root", "root", "localhost", 3306, "test002")    db, err := sql.Open("mysql", dsn)    if err != nil {        return nil, err    }    err = db.Ping()    if err != nil {        return nil, err    }    return db, nil} func (mysql *MySQLDB) CloseConnection(db *sql.DB) error {    return db.Close()} func (mysql *MySQLDB) QueryRowDemo(db *sql.DB, query string, args ...interface{}) (*sql.Row, error) {    return db.QueryRow(query, args...), nil} func (mysql *MySQLDB) QueryDemo(db *sql.DB, query string, args ...interface{}) (*sql.Rows, error) {    return db.Query(query, args...)} func (mysql *MySQLDB) ExecDemo(db *sql.DB, query string, args ...interface{}) (sql.Result, error) {    return db.Exec(query, args...)} func main() {    dbOperator := &MySQLDB{}    db, err := dbOperator.OpenConnection()    if err != nil {        log.Fatal(err)    }    defer dbOperator.CloseConnection(db)     // 使用db进行数据库操作    rows, err := dbOperator.QueryDemo(db, "SELECT * FROM test WHERE id = ?", 4)	if err != nil {		log.Fatal("Error querying database:", err)	}		defer rows.Close()		// 遍历查询结果	for rows.Next() {		var id int		var name string		err := rows.Scan(&id, &name)		if err != nil {			log.Fatal("Error scanning row:", err)		}		fmt.Printf("ID: %d, Name: %s\n", id, name)	}	if err := rows.Err(); err != nil {		log.Fatal(err)	}}

到这里,我们的数据访问程序就结束了。

下一章,我们将把我的取名程序改造一下,我们的名称定义将放在数据库中维护,这样使我们的取名程序更加的系统化吧

标签: #go语言的数据库 #如何获取数据库里面的数据信息