Go语言的数据库交互

Go语言的数据库交互

引言

在现代软件开发中,数据库是应用程序不可或缺的组成部分。无论是处理用户数据、管理资产信息,还是记录日志,数据库都发挥着重要作用。Go语言以其简洁的语法和优异的并发性能,逐渐成为开发高效、可扩展应用程序的热门选择。在本篇文章中,我们将探讨如何在Go语言中进行数据库交互,包括连接到数据库、执行查询、处理结果和使用ORM等相关内容。

一、Go语言与数据库的支持

Go语言内置了对多种数据库的支持,最常见的包括:

  1. 关系型数据库
  2. MySQL
  3. PostgreSQL
  4. SQLite

  5. 非关系型数据库

  6. MongoDB
  7. Redis
  8. Cassandra

Go语言使用数据库驱动程序与数据库进行通信,这些驱动程序通常遵循database/sql标准库的接口规范。

二、环境准备

在开始之前,我们需要确保已经安装了Go语言及相应的数据库。并且需要安装相应的数据库驱动程序。

1. 安装Go语言

Go语言的安装可以参考Go官方文档。安装完成后,可以通过命令go version来确认安装成功。

2. 安装数据库

以MySQL为例,可以通过以下命令在Linux系统上安装:

bash sudo apt-get install mysql-server

安装完成后,确保MySQL服务正在运行,并创建一个测试数据库。例如,我们可以创建一个名为testdb的数据库。

3. 安装Go MySQL驱动

可以使用以下命令安装Go MySQL驱动:

bash go get -u github.com/go-sql-driver/mysql

三、连接到数据库

在Go中,我们使用database/sql包来管理数据库连接。下面是一个基本的示例代码,演示如何连接到MySQL数据库。

```go package main

import ( "database/sql" "fmt" "log"

_ "github.com/go-sql-driver/mysql"

)

func main() { // 数据库连接信息 dsn := "username:password@tcp(127.0.0.1:3306)/testdb"

// 连接到数据库
db, err := sql.Open("mysql", dsn)
if err != nil {log.Fatal(err)
}
defer db.Close()// 测试连接
err = db.Ping()
if err != nil {log.Fatal(err)
}
fmt.Println("成功连接到数据库!")

} ```

说明

  • dsn(数据源名称)是连接数据库所需的信息,包括用户名、密码、主机、端口和数据库名。
  • 使用sql.Open()函数来初始化数据库连接。
  • defer db.Close()确保在程序退出时关闭数据库连接。
  • 使用db.Ping()来测试连接是否成功。

四、执行查询

一旦成功连接到数据库,可以开始执行SQL查询。基础的查询操作主要使用Query()QueryRow()方法。

1. 查询多行数据

下面是一个示例,演示如何从数据库中查询多行数据。

```go func queryUsers(db *sql.DB) { rows, err := db.Query("SELECT id, name, age FROM users") if err != nil { log.Fatal(err) } defer rows.Close()

for rows.Next() {var id intvar name stringvar age interr := rows.Scan(&id, &name, &age)if err != nil {log.Fatal(err)}fmt.Printf("用户ID: %d, 姓名: %s, 年龄: %d\n", id, name, age)
}// 检查迭代过程中是否有错误
if err = rows.Err(); err != nil {log.Fatal(err)
}

} ```

2. 查询单行数据

如果只需要查询一行数据,可以使用QueryRow()方法。以下是一个示例:

```go func queryUserByID(db *sql.DB, userID int) { var id int var name string var age int

err := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", userID).Scan(&id, &name, &age)
if err != nil {if err == sql.ErrNoRows {fmt.Println("未找到用户")} else {log.Fatal(err)}
} else {fmt.Printf("用户ID: %d, 姓名: %s, 年龄: %d\n", id, name, age)
}

} ```

五、插入数据

插入数据可以使用Exec()方法。以下是一个插入用户的示例:

```go func insertUser(db *sql.DB, name string, age int) { stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)") if err != nil { log.Fatal(err) } defer stmt.Close()

res, err := stmt.Exec(name, age)
if err != nil {log.Fatal(err)
}id, err := res.LastInsertId()
if err != nil {log.Fatal(err)
}fmt.Printf("插入用户成功,用户ID为:%d\n", id)

} ```

说明

  • 使用db.Prepare()创建一个可重用的SQL语句。
  • Exec()方法用于执行该语句,并可以获取操作结果,例如最后插入的ID。

六、更新和删除数据

更新和删除数据的操作也很简单,同样使用Exec()方法即可。

1. 更新数据

下面是一个更新用户年龄的示例:

```go func updateUserAge(db *sql.DB, userID int, newAge int) { res, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", newAge, userID) if err != nil { log.Fatal(err) }

rowsAffected, err := res.RowsAffected()
if err != nil {log.Fatal(err)
}fmt.Printf("更新用户成功,受影响的行数:%d\n", rowsAffected)

} ```

2. 删除数据

下面是一个删除用户的示例:

```go func deleteUser(db *sql.DB, userID int) { res, err := db.Exec("DELETE FROM users WHERE id = ?", userID) if err != nil { log.Fatal(err) }

rowsAffected, err := res.RowsAffected()
if err != nil {log.Fatal(err)
}fmt.Printf("删除用户成功,受影响的行数:%d\n", rowsAffected)

} ```

七、使用事务

在实际应用中,数据库操作通常是原子性的,即要么全部成功,要么全部失败。在Go中,我们可以使用事务来确保这一点。

开启一个事务的示例:

```go func transferFunds(db *sql.DB, fromUserID int, toUserID int, amount float64) error { tx, err := db.Begin() if err != nil { return err }

// 扣款
_, err = tx.Exec("UPDATE users SET balance = balance - ? WHERE id = ?", amount, fromUserID)
if err != nil {tx.Rollback()return err
}// 充值
_, err = tx.Exec("UPDATE users SET balance = balance + ? WHERE id = ?", amount, toUserID)
if err != nil {tx.Rollback()return err
}// 提交事务
return tx.Commit()

} ```

说明

  • 通过db.Begin()方法开始一个事务。
  • 在事务内部执行多个数据库操作。
  • 如果某个操作出错,使用tx.Rollback()回滚事务;如果所有操作都成功,则调用tx.Commit()提交事务。

八、使用ORM

在Go中,除了原生的SQL操作外,还可以使用ORM(对象关系映射)库来简化数据库交互。常用的ORM库有GORM和ent。

1. GORM的安装和使用

可以通过以下命令安装GORM:

bash go get -u gorm.io/gorm go get -u gorm.io/driver/mysql

下面是一个使用GORM的示例:

```go package main

import ( "gorm.io/driver/mysql" "gorm.io/gorm" )

// User模型 type User struct { ID uint gorm:"primaryKey" Name string Age int }

func main() { dsn := "username:password@tcp(127.0.0.1:3306)/testdb" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(err) }

// 自动迁移
db.AutoMigrate(&User{})// 创建
db.Create(&User{Name: "Alice", Age: 25})// 查询
var user User
db.First(&user, 1)
fmt.Println(user.Name)// 更新
db.Model(&user).Update("Age", 26)// 删除
db.Delete(&user, 1)

} ```

说明

  • 使用GORM非常直观,可以直接通过结构体进行CRUD操作。
  • 通过AutoMigrate()方法自动迁移数据库结构。
  • GORM支持链式调用,方便构建复杂的查询。

九、总结

在本篇文章中,我们深入探讨了Go语言与数据库交互的各个方面。通过标准库database/sql和ORM库GORM,我们可以轻松地执行CRUD操作,管理数据库连接及事务。在后续的开发中,可以根据需要选择合适的工具和方法来进行数据库操作。Go语言的并发性能和简洁的语法,使得它在构建高性能的数据库应用时具备了显著优势。希望本文对你在Go中的数据库交互有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503453.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP/HTTPS ②-Cookie || Session || HTTP报头

这里是Themberfue 上篇文章介绍了HTTP报头的首行信息 本篇我们将更进一步讲解HTTP报头键值对的含义~~~ ❤️❤️❤️❤️ 报头Header ✨再上一篇的学习中,我们了解了HTTP的报头主要是通过键值对的结构存储和表达信息的;我们已经了解了首行的HTTP方法和UR…

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站(开机)与欢迎信息:/etc/issue,/etc/motd (1)/etc/issue (2)/etc/motd 3、bash的环境配置文件 (1)login与non-…

最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中,使用 PaddleOCR 模型时效率较慢,经测试每张图片的检测与识别平均耗时超过 5 秒,这在需要大规模自动化处理的场景中无法满足需求。为此,我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理,以提升效率。…

51单片机——共阴数码管实验

数码管中有8位数字,从右往左分别为LED1、LED2、...、LED8,如下图所示 如何实现点亮单个数字,用下图中的ABC来实现 P2.2管脚控制A,P2.3管脚控制B,P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…

mv指令详解

🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性,后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排,到底部再换第二排,文字与文字之间从…

【JMM】Java 内存模型

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前言2. JMM 内存模型内容3. JMM 内存模型简单执行示意图 ⚠️ 不要与 JVM 内存分布混为一谈论&#xff0c…

服务器等保测评审计日志功能开启(auditd)和时间校准

操作系统审计日志功能开启auditd CentOS 7 默认已经安装 auditd,如果没有,可以通过以下命令安装: yum install audit systemctl start auditd systemctl enable auditd配置审计规则 配置审计规则。添加所需的审计规则 永久规则文件&#xff1…

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 (一)查看是否存在该安装包 (二)安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行(针对visual studio) 查看迁移功能的常用命令: 查看…

改进萤火虫算法之一:离散萤火虫算法(Discrete Firefly Algorithm, DFA)

离散萤火虫算法(Discrete Firefly Algorithm, DFA)是萤火虫算法的一种重要变种,专门用于解决离散优化问题。 一、基本概念 离散萤火虫算法将萤火虫算法的基本原理应用于离散空间,通过模拟萤火虫的闪烁行为来寻找全局最优解。在离散空间中,萤火虫的亮度代表解的优劣,较亮的…

Java SpringBoot使用EasyExcel导入导出Excel文件

点击下载《Java SpringBoot使用EasyExcel导入导出Excel文件(源代码)》 在 Java Spring Boot 项目中,导入(读取)和导出(写入) Excel 文件是一项常见的需求。EasyExcel 是阿里巴巴开源的一个用于简化 Java 环境下 Excel…

十年后LabVIEW编程知识是否会过时?

在考虑LabVIEW编程知识在未来十年内的有效性时,我们可以从几个角度进行分析: ​ 1. 技术发展与软件更新 随着技术的快速发展,许多编程工具和平台不断更新和改进,LabVIEW也不例外。十年后,可能会有新的编程语言或平台…

【Linux】文件的压缩与解压

目录 gzip和 gunzip bzip2 和 bunzip2(特点和gzip相似) xz和unxz(特点和gzip相似) zip 和 unzip tar gzip和 gunzip 特点:只能对单个的普通文件进行压缩 不能进行归档,压缩或解压后的源文件都不存在 压缩后所生成的压缩格式是.gz格式 压缩&…

touch详讲

🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …

【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)

本文项目编号 T 153 ,文末自助获取源码 \color{red}{T153,文末自助获取源码} T153,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2

在当今这个高效运作、安全第一的物流时代,仓库作为供应链的中心地带,其安全与效率直接关系到企业的命脉。 随着科技的飞速发展,传统叉车作业模式正逐步向智能化、安全化转型,而在这场技术革新中,AI防碰撞系统N2024G-2…

如何打开/处理大型dat文件?二进制格式.dat文件如何打开?Python读取.dat文件

背景&#xff1a; 希望查看C语言输出的二进制DAT文件&#xff0c;写入方式如下&#xff08;如果是视频或游戏&#xff0c;未必能使用这种方式打开&#xff0c;关键是需要知道数据的格式&#xff09; # 写入二进制的C语言fp fopen(str, "wb");for (int i 0; i < …

面向对象分析与设计Python版 活动图与类图

文章目录 一、活动图二、类图 一、活动图 活动图 活动图用于描述业务流程、工作流程或算法中的控制流。活动图强调的是流程中的各个步骤的先后顺序&#xff0c;它可以帮助系统分析师、设计师和程序员更好地理解系统的动态行为。 活动图与用例模型互为补充&#xff0c;主要用于…