在 Golang 应用程序中管理多个数据库

掌握在 Golang 项目中处理多个数据库的艺术
在当前软件开发领域中,处理单个应用程序内的多个数据库的需求越来越普遍。具有强大功能的 Golang 是处理此类任务的绝佳解决方案,无论您是与多个数据源合作还是仅为增强组织和可扩展性而分隔数据。在本文中,我们将探讨如何在 Golang 应用程序中管理多个数据库。我们将查看实际情况并提供逐步教程,帮助您掌握这一重要技能。
为什么要管理多个数据库?
在深入细节之前,了解为什么需要在单个 Golang 应用程序中管理多个数据库是至关重要的。
- 数据隔离:在不同数据库中进行数据隔离对于安全性和合规性至关重要。例如,您可能希望将敏感用户信息与较不重要的数据分隔在单独的数据库中。
- 可扩展性:在各个数据库之间分布数据可以提高应用程序的速度和可扩展性。您可以对数据进行分片,使其更容易处理更大的数据集。
- 第三方集成:许多应用程序需要与其他服务或旧数据库交互,因此需要维护多个数据库连接。
既然我们清楚了为什么要这样做,那么我们就来看看如何做。
第一步:安装依赖项
首先,请确保您的系统上已安装了 Go。您还需要为您打算使用的每个数据库导入必要的数据库驱动程序。流行的数据库驱动程序包括用于 PostgreSQL 的 pq,用于 MySQL 的 go-sql-driver/mysql,以及用于 SQLite 的 github.com/mattn/go-sqlite3。
import ("database/sql"_ "github.com/lib/pq"_ "github.com/go-sql-driver/mysql"_ "github.com/mattn/go-sqlite3"
)
第二步:配置数据库连接
您应该有一个配置文件,该文件指定了每个数据库的连接详细信息。这样可以轻松管理和修改数据库参数,而无需更改您应用程序的源代码。
type DatabaseConfig struct {Name stringHost stringPort intUser stringPassword string
}
第三步:建立数据库连接
现在,让我们创建函数来与您的每个数据库建立连接。我们将使用database/sql包来管理这些连接。
func ConnectToPostgreSQL(config DatabaseConfig) (*sql.DB, error) {connStr := fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%d sslmode=disable",config.User, config.Password, config.Name, config.Host, config.Port)db, err := sql.Open("postgres", connStr)if err != nil {return nil, err}return db, nil
}func ConnectToMySQL(config DatabaseConfig) (*sql.DB, error) {connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", config.User, config.Password, config.Host, config.Port, config.Name)db, err := sql.Open("mysql", connStr)if err != nil {return nil, err}return db, nil
}func ConnectToSQLite(config DatabaseConfig) (*sql.DB, error) {db, err := sql.Open("sqlite3", config.Name)if err != nil {return nil, err}return db, nil
}
第四步:初始化数据库连接
在应用程序的初始化阶段,使用您特定的配置参数调用这些连接函数,以与您的数据库建立连接。
func main() {postgresConfig := DatabaseConfig{Name: "my_postgres_db",Host: "localhost",Port: 5432,User: "postgres",Password: "password",}mysqlConfig := DatabaseConfig{Name: "my_mysql_db",Host: "localhost",Port: 3306,User: "root",Password: "password",}sqliteConfig := DatabaseConfig{Name: "my_sqlite_db.db",}postgresDB, err := ConnectToPostgreSQL(postgresConfig)if err != nil {log.Fatal(err)}mysqlDB, err := ConnectToMySQL(mysqlConfig)if err != nil {log.Fatal(err)}sqliteDB, err := ConnectToSQLite(sqliteConfig)if err != nil {log.Fatal(err)}// Now you have connections to all your databases: postgresDB, mysqlDB, and sqliteDB
}
与多个数据库交互
在建立了数据库连接之后,让我们探讨如何在您的 Golang 应用程序中与这些数据库互动。
查询特定数据库
当您想要在特定数据库上执行操作时,简单地使用您之前初始化的相应数据库连接即可。
// Example query on the PostgreSQL database
rows, err := postgresDB.Query("SELECT * FROM users")
if err != nil {log.Fatal(err)
}
defer rows.Close()for rows.Next() {var id intvar username string// Scan row data into variableserr := rows.Scan(&id, &username)if err != nil {log.Fatal(err)}fmt.Printf("ID: %d, Username: %s\n", id, username)
}
执行事务
跨多个数据库执行事务可能会更加复杂。您需要确保在出现故障的情况下数据的一致性。以下是您如何在两个数据库之间执行事务的方法:
// Begin a transaction on PostgreSQL
txPostgres, err := postgresDB.Begin()
if err != nil {log.Fatal(err)
}
defer txPostgres.Rollback() // Rollback on error, or defer Commit() for a successful transaction// Begin a transaction on MySQL
txMySQL, err := mysqlDB.Begin()
if err != nil {log.Fatal(err)
}
defer txMySQL.Rollback()// Perform your database operations within each transaction
_, err = txPostgres.Exec("UPDATE table1 SET column1 = 'new_value' WHERE id = 1")
if err != nil {log.Fatal(err)
}_, err = txMySQL.Exec("INSERT INTO table2 (column2) VALUES ('value')")
if err != nil {log.Fatal(err)
}// Commit the transactions if everything is successful
err = txPostgres.Commit()
if err != nil {log.Fatal(err)
}err = txMySQL.Commit()
if err != nil {log.Fatal(err)
}
结论
在这篇详细的文章中,我们涵盖了在Golang应用程序中处理多个数据库的基本知识。现在,您已经掌握了处理复杂数据场景的基本技能,从设置多个数据库到完成事务。
对于在各种项目上工作的开发人员来说,管理多个数据库是一项重要的能力。它为构建能够顺利处理多个数据源的复杂应用程序提供了所需的可扩展性和灵活性。随着您在开发Golang应用程序的冒险中继续前进,管理多个数据库的能力无疑将成为您工具包中的关键特性。
相关文章:
在 Golang 应用程序中管理多个数据库
掌握在 Golang 项目中处理多个数据库的艺术 在当前软件开发领域中,处理单个应用程序内的多个数据库的需求越来越普遍。具有强大功能的 Golang 是处理此类任务的绝佳解决方案,无论您是与多个数据源合作还是仅为增强组织和可扩展性而分隔数据。在本文中&a…...
理解开源协议GPL、MIT、BSD、Apache License
开源协议是一种法律文件,规定了使用、修改和分享开源软件的规则和条件。以下是一些常见的开源协议及其相同点和区别:GPL(GNU General Public License):GPL 是一种比较严格的开源协议,要求使用者如果对开源软…...
Talk | 北京大学博士生汪海洋:通向3D感知大模型的前置方案
本期为TechBeat人工智能社区第559期线上Talk。 北京时间12月28日(周四)20:00,北京大学博士生—汪海洋的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “通向3D感知大模型的前置方案”,介绍了他的团队在3D视觉大模型的前置方…...
【C语言数组传参】规则详解
目录 数组传参介绍 数组传参规则 数组传参的实参 特殊情况一:sizeof(数组名) 特殊情况二:&数组名 数组传参的形参 数组传参使用数组名作为形参接收 形参如果是⼀维数组 形参如果是⼆维数组 数组传参使用指针作为形参…...
【Linux】Ubuntu22.04版本下实现gcc版本的快速切换
本文将介绍如何在Ubuntu22.04版本下实现gcc版本的快速切换。 本文首发于 ❄️慕雪的寒舍 前言 有的时候,不同版本的gcc会造成一些细微的差异,导致相关的一些工具不兼容,比如用于单元测试覆盖率生成的gcov/lcov工具,在不同的gcc版…...
使用Node Exporter采集主机数据
安装 Node Exporter 在 Prometheus 的架构设计中,Prometheus Server 并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的 CPU 使用率,我们…...
Django 文件上传(十二)
当 Django 处理文件上传时,文件数据最终会被放置在 request.FILES 。 查看文档:文件上传 | Django 文档 | Django Django工程如下: 创建本地存储目录 在static/应用目录下创建uploads目录用于存储接收上传的文件 在settings.py 配置静态目…...
k8s的陈述式资源管理
k8s的陈述式资源管理: 命令行:kubectl命令行工具 优点:90%以上的场景都可以满足 对资源的增,删,查比较方便,对改不是很友好 缺点: 命令比较冗长,复杂,难记 声明式&…...
electron-builder 打包exe后白屏
项目用的是An Electron application with Vue3 and TypeScript。 Debug运行项目没问题,可以显示页面。不过有浏览器控制台显示错误: Unable to load preload script:preload/index.js Unable to load preload script 翻译后:无法…...
mvvm,vue双向数据绑定的原理
MVVM (Model-View-ViewModel) 是一种设计模式,主要用于构建用户界面。在 MVVM 中,Model 表示应用程序的数据,View 表示用户界面,而 ViewModel 是 Model 和 View 之间的连接器。MVVM 的核心思想是将视图与模型分离,使它…...
【Java中序列化的原理是什么(解析)】
🍁序列化的原理是什么? 🍁典型-----解析🍁拓展知识仓🍁Serializable 和 Externalizable 接门有何不同? 🍁如果序列化后的文件或者原始类被篡改,还能被反序列化吗?🍁serialVersionU…...
冠赢互娱基于 OpenKrusieGame 实现游戏云原生架构升级
作者:力铭 关于冠赢互娱 冠赢互娱是一家集手游、网游、VR 游戏等研发、发行于一体的游戏公司,旗下官方正版授权的传奇类手游——《仙境传奇》系列深受广大玩家们的喜爱。基于多年 MMORPG 类型游戏的自研与运营经验,冠赢互娱正式推出了 2D M…...
Mybatis 动态 SQL - trim, where, set
之前的例子都巧妙地避开了一个臭名昭著的动态SQL挑战。考虑一下如果我们回到之前的“if”例子,但这次我们将“ACTIVE 1”也作为一个动态条件。 <select id"findActiveBlogLike"resultType"Blog">SELECT * FROM BLOGWHERE<if test&qu…...
大模型系列:OpenAI使用技巧_使用OpenAI进行K-means聚类
文章目录 1. 使用K-means算法找到聚类2. 聚类中的文本样本和聚类的命名让我们展示每个聚类中的随机样本。 我们使用一个简单的k-means算法来演示如何进行聚类。聚类可以帮助发现数据中有价值的隐藏分组。数据集是在 Get_embeddings_from_dataset Notebook中创建的。 # 导入必要…...
共享单车之数据分析
文章目录 第1关:统计共享单车每天的平均使用时间第2关:统计共享单车在指定地点的每天平均次数第3关:统计共享单车指定车辆每次使用的空闲平均时间第4关:统计指定时间共享单车使用次数第5关:统计共享单车线路流量 第1关…...
Spring的Bean你了解吗
Bean的配置 Spring容器支持XML(常用)和Properties两种格式的配置文件 Spring中XML配置文件的根元素是,中包含了多个子元素,每个子元素定义了一个Bean,并描述了该Bean如何装配到Spring容器中 元素包含了多个属性以及子元素,常用属性及子元素如下所示 i…...
MongoDB聚合:$merge 阶段(1)
$merge的用途是把聚合管道产生的结果写入指定的集合,有时候可以用$merge来做物化视图。需要注意,$meger操作必须是聚合管道的最后一个阶段。具体功能有: 能够输出到当前或不同的数据库能够输出到正在聚合的集合(慎重:…...
2. 云原生实战之kubesphere搭建
文章目录 机器介绍centos基本配置安装 VMware Tools设置静态ip关闭防火墙关闭SELinux开启时间同步配置host和hostname 安装kubesphere依赖项安装配置文件准备执行安装命令 机器介绍 在ESXI中准备虚拟机,部署参考官网:https://kubesphere.io/zh/ CentOs…...
main参数传递、反汇编、汇编混合编程
week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12,可以调用atoi…...
前后端分离nodejs+vue医院预约挂号系统6nrhh
医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架:Express/koa 前端:Vue.js 数据库:mysql 开发软件:VScode/webstorm/hbuiderx均…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
