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


配置文件在软件开发和系统管理中扮演着重要的角色,它们用于定义软件运行时的各种参数和设置。其保证了项目代码的灵活性, 安全性, 维护性等多重性质。
本文以 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 config

func 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.User
	dbPass := c.Database.MySQL.Password
	dbHost := c.Database.MySQL.Host
	dbPort := c.Database.MySQL.Port
	dbName := c.Database.MySQL.DBName
	timeout := c.Database.MySQL.Timeout

	logFile, 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")
}
### 启动 Ollama 服务的方法 对于希望启动 Ollama 服务或应用程序的情况,具体操作取决于所使用开发环境以及目标平台。当使用 Go 构建基于 Ollama 的检索增强生成 (RAG) 应用程序时,通常会通过命令行工具来初始化和启动服务[^1]。 #### 使用 Docker 容器化部署 如果选择了容器化的方案,则可以通过 Docker 来管理和启动 Ollama 服务。这涉及到编写 `Dockerfile` 文件定义应用的运行环境,并利用 docker-compose 或者 kubernetes 配置文件设置多容器的应用架构。然而,在简单的场景下,直接拉取官方镜像并执行可能是更便捷的方式: ```bash docker pull ollama/ollama:latest docker run -p 8000:8000 ollama/ollama ``` 上述命令将会下载最新的 Ollama 映像版本并将端口映射到主机上的 8000 端口以便访问 API 接口。 #### 基于本地机器的安装与启动 针对那些偏好在个人计算机而非云端服务器上测试 Ollama 功能的人群来说,《本地电脑大模型系列之 06 使用 Python 实现 Genai》一文中提到可以在不依赖 GPU 加速的情况下配置轻量级的语言处理框架[^2]。尽管该文章主要讨论的是 Python 生态圈内的实现细节,但对于其他编程语言Go 而言,相似的原则同样适用——即确保所有必需库已正确加载并且路径变量已经适当调整之后再尝试调用相应的二进制可执行文件或者脚本完成启动过程。 为了简化流程,假设已经在项目根目录放置了一个名为 `main.go` 的入口文件用于构建 RAG 应用逻辑;那么可以按照如下方式编译并运行此程序: ```go package main import ( "log" "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() apiGroup := router.Group("/api/v1") { apiGroup.GET("/", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "Ollama service is running"}) }) } log.Fatal(router.Run(":9090")) } ``` 这段代码片段展示了如何创建一个简易 HTTP RESTful Web Service 并监听指定端口号等待客户端请求的到来。实际应用场景中可能还需要集成更多功能模块比如连接数据库、解析自然语言输入等特性以满足业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值