一文讲懂Go语言如何使用配置文件连接数据库

devtools/2025/3/11 5:34:30/

一文讲懂Go语言如何使用配置文件连接数据库

  • viper
    • 1. viper简介
    • 2. viper 读取.toml配置文件
      • 定义Go语言结构体
      • 编写与Go语言结构体对应的.toml配置文件
      • 定义初始化函数
      • 定义get函数
  • 连接数据库
    • 1. 定义数据库对象
    • 2. 定义初始化函数
    • 3. 定义 get 函数
    • 4. 定义 main 函数, 连接数据库

配置文件在软件开发和系统管理中扮演着重要的角色,它们用于定义软件运行时的各种参数和设置。其保证了项目代码的灵活性, 安全性, 维护性等多重性质。
本文以 viper 第三方库连接 MySQL为例, 讲解 go语言 如何使用配置文件连接数据库

本文默认读者已经熟悉如何直接从 go语言 连接数据库。若需了解如何从go语言连接数据库可以点击 go语言连接MySQL数据库详解(单机版) 进行学习

viper

1. viper简介

Viper支持JSON, TOML, YAML, HCL, INI, envfile和Java Properties files文件。viper可以搜索多条路径,但是 目前,单个Viper实例只支持单个配置文件。

2. viper 读取.toml配置文件

TOML文件格式是一种旨在易于阅读且具有最小语义的配置文件格式。它由GitHub上的开发者Tom Preston-Werner创建,旨在成为一种更简单、更明确的替代JSON和YAML等其他配置文件格式的选择。其拥有易读性, 简介性, 明确性等优点。
.toml配置文件教程

下载 viper

go get github.com/spf13/viper  

定义Go语言结构体

# 因实际开发中不止需要配置数据库, 故使用嵌套结构体
type config struct {Database Database
}type Database struct {MySQL MySQLConf
}type MySQLConf struct {User         string `mapstructure:"user"`Password     string `mapstructure:"password"`Host         string `mapstructure:"host"`Port         int    `mapstructure:"port"`DBName       string `mapstructure:"db_name"`MaxOpenConns int    `mapstructure:"max_open_conns"`MaxIdleConns int    `mapstructure:"max_idle_conns"`Timeout      string `mapstructure:"timeout"`
}

编写与Go语言结构体对应的.toml配置文件

[databasse]
[database.mysql]
user = "Golang"
password = "go123123"
host = "localhost"
port = 3306
db_name= "test"
max_open_conns = 100
max_idle_conns = 20
timeout = "15s"

定义初始化函数

# 定义结构体对象
var c configfunc init() {# 设置配置文件的文件名viper.SetConfigName("config")# 设置配置文件的文件格式viper.SetConfigType("toml")# 设置配置文件的文件路径viper.AddConfigPath(".")# 日志文件对象logFile, err := os.OpenFile("/var/lib/APP/conf.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {log.Println(err)}defer logFile.Close()log.SetOutput(logFile)// 读取配置文件err = viper.ReadInConfig()if err != nil {log.Printf("config load Error: %v \n", err)} else {log.Println("configuration file was read successfully")}// 将 viper 读到的反数据序列化写入 config 对象中viper.Unmarshal(&c)
}

定义get函数

func GetConfig() *config {return &c
}

连接数据库

1. 定义数据库对象

var _db *sqlx.DB

2. 定义初始化函数

func init() {c := config.GetConfig()dbUser := c.Database.MySQL.UserdbPass := c.Database.MySQL.PassworddbHost := c.Database.MySQL.HostdbPort := c.Database.MySQL.PortdbName := c.Database.MySQL.DBNametimeout := c.Database.MySQL.TimeoutlogFile, err := os.OpenFile("/var/lib/APP/mysql.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {log.Println(err)}defer logFile.Close()dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&timeout=%s", dbUser, dbPass, dbHost, dbPort, dbName, timeout)_db, err := sqlx.Connect("mysql", dsn)if err != nil {log.Printf("MySQL connect err: %v", err)}log.SetOutput(logFile)_db.SetMaxOpenConns(c.Database.MySQL.MaxOpenConns)_db.SetMaxIdleConns(c.Database.MySQL.MaxIdleConns)
}

3. 定义 get 函数

func GetDB() *sqlx.DB {return _db
}

4. 定义 main 函数, 连接数据库

func main() {mysql := mysql.GetDB()defer mysql.Close()sqlStr := "insert into sql_test.user(name, age) values (?, ?)"stmt, err := db.Prepare(sqlStr)if err != nil {fmt.Printf("prepare failed err: %v \n", err)}_, err = stmt.Exec("张三", 24)if err != nil {fmt.Printf("insert failed err: %v \n", err)}fmt.Println("insert success")
}

http://www.ppmy.cn/devtools/166194.html

相关文章

JAVA通过SSE实现消息推送

JAVA通过SSE实现消息推送 1.什么是SSE?2.SSE技术的基本原理3.SSE和Socket的区别4.编写SSE服务,来进行创建链接和发送消息5.前端实现消息监听 1.什么是SSE? SSE(Server-Sent Events)是一种用于实现服务器主动向客户端推…

蓝桥杯 字符串拼接【省模拟赛】

问题描述 给定四个字符串 a,b,c,da,b,c,d,请将这四个字符串按照任意顺序依次连接拼成一个字符串。 请问拼成的字符串字典序最小是多少? 输入格式 输入四行,每行包含一个字符串。 输出格式 输出一行包含一个字符串,表示答案。 样例…

React基础之组件

在React中一个组件就是首字母大写的函数&#xff0c;内部存放了组件的逻辑和视图UI&#xff0c;渲染组件只需要把组件当作标签书写即可 //定义组件 // function Button(){ // return <button>click me&#xff01;</button> // } //也可以使用箭头函数来定义 co…

Gazebo不报错但是没有机器人模型

现象是&#xff0c;gazebo能打开&#xff0c;有世界模型&#xff0c;但是没有机器人模型&#xff1b;排查过不是模型文件的问题&#xff0c;因为啥模型都有这样的现象。 这种情况可以参考以下解决办法&#xff1a; &#xff08;1&#xff09;看看catkin_ws中有没有gazebo_ros…

【AI】AI开源IDE:CLine源码分析报告

1. 源码位置&#xff1a; CLine 是一个开源的 VSCode 插件&#xff0c;其完整源码托管在 GitHub 的 cline/cline 仓库中。这个仓库包含 CLine 的核心逻辑&#xff08;TypeScript 编写&#xff09;&#xff0c;包括与 LLM 的对话控制、工具调用接口&#xff0c;以及 VSCode 插件…

Android 检查更新

首先服务类 public class UpdateService extends Service {private static final String NOTIFY_CHANNEL_ID "com.jianke.api.UpdateService";public static final String BROADCAST_UPDATE_VERSION_AUTH_INSTALL_APK "BROADCAST_UPDATE_VERSION_AUTH_INSTAL…

【定制开发】碰一碰发视频系统定制开发,支持OEM

在短视频营销爆发的2025年&#xff0c;"碰一碰发视频"技术已成为实体商家引流标配。某连锁餐饮品牌通过定制化开发&#xff0c;单月视频发布量突破10万条&#xff0c;获客成本降低80%&#xff01;本文将深入解析该系统的技术架构与开发要点&#xff0c;助你快速搭建高…

linux的top指令解析

这张图片显示的是 Linux 系统中 top 命令的输出&#xff0c;它用于实时监控系统的资源使用情况&#xff0c;包括 CPU、内存和进程等信息。以下是对图片中几个关键参数的解释&#xff1a; 系统负载 (Load Average) 1分钟、5分钟、15分钟负载平均值&#xff1a;这三个数值表示系…