15分钟学 Go 第 38 天:数据库基础
第38天 - 数据库基础
学习目标
学习如何连接和操作数据库,包括基本的增、删、改、查功能,以及如何使用Go语言中的database/sql包进行数据库交互。
内容概述
在现代应用程序中,数据库是数据持久化的重要部分。Go语言通过database/sql包提供了对SQL数据库的标准接口,使得我们可以用Go语言方便地操作各种关系型数据库,比如MySQL、PostgreSQL和SQLite等。本教程将详细介绍如何在Go语言中连接数据库、执行基本的SQL操作,并通过实例代码帮助理解。
1. 数据库基本概念
在深入Go语言的数据库操作之前,我们先了解一些基本的数据库概念:
- 关系型数据库:按照表的形式存储数据,并且表与表之间存在关系,如MySQL、PostgreSQL等。
- SQL(结构化查询语言):用于与关系型数据库进行交互的语言,包括查询、更新、插入和删除数据。
- Driver:数据库驱动程序,用于在Go应用与数据库之间进行通信。
数据库连接字符串
连接字符串包含了访问数据库所需的信息,包括用户名、密码、数据库地址和数据库名称等。不同类型的数据库连接字符串格式有所不同:
- MySQL连接字符串示例:
username:password@tcp(127.0.0.1:3306)/dbname
2. Go环境准备
在Go语言中操作数据库,我们首先需要安装相应的数据库驱动。以MySQL为例,使用以下命令安装驱动:
go get -u github.com/go-sql-driver/mysql
3. 基本的数据库操作
3.1 连接数据库
使用database/sql包连接数据库的基本步骤如下:
package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql"
)func main() {// 数据库连接字符串dsn := "username:password@tcp(127.0.0.1:3306)/dbname"// 连接数据库db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}defer db.Close()// 测试数据库连接if err := db.Ping(); err != nil {log.Fatal(err)}fmt.Println("成功连接到数据库!")
}
3.2 执行基本操作
3.2.1 创建表
确保在数据库中创建一个示例表格用于后面的操作:
createTable := `CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),age INT
);`
_, err = db.Exec(createTable)
if err != nil {log.Fatal(err)
}
3.2.2 插入数据
插入一条用户数据的示例:
insertUser := `INSERT INTO users (name, age) VALUES (?, ?)`
_, err = db.Exec(insertUser, "Alice", 30)
if err != nil {log.Fatal(err)
}
fmt.Println("用户插入成功!")
3.2.3 查询数据
查询用户数据的示例:
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 intif err := rows.Scan(&id, &name, &age); err != nil {log.Fatal(err)}fmt.Printf("用户ID: %d, 名称: %s, 年龄: %d\n", id, name, age)
}
3.2.4 更新数据
更新用户年龄的示例:
updateUser := `UPDATE users SET age = ? WHERE name = ?`
_, err = db.Exec(updateUser, 31, "Alice")
if err != nil {log.Fatal(err)
}
fmt.Println("用户年龄更新成功!")
3.2.5 删除数据
删除用户的示例:
deleteUser := `DELETE FROM users WHERE name = ?`
_, err = db.Exec(deleteUser, "Alice")
if err != nil {log.Fatal(err)
}
fmt.Println("用户删除成功!")
4. 错误处理
在数据库操作中,要始终注意处理错误。对于每一步数据库操作,都需要检查返回的错误,保证程序的稳定性。
5. 总结与最佳实践
- 连接池:使用
sql.DB类型的连接池管理数据库连接,避免频繁建立和关闭连接带来的性能损耗。 - 参数化查询:使用参数化查询以防止SQL注入攻击。
- 事务处理:在需要保证原子性和一致性的操作时(如转账),使用数据库事务。
6. 示例代码完整性
以下是完整示例代码,包含所有操作:
package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql"
)func main() {dsn := "username:password@tcp(127.0.0.1:3306)/dbname"db, err := sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}defer db.Close()if err := db.Ping(); err != nil {log.Fatal(err)}fmt.Println("成功连接到数据库!")// 创建表createTable := `CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),age INT);`_, err = db.Exec(createTable)if err != nil {log.Fatal(err)}// 插入数据insertUser := `INSERT INTO users (name, age) VALUES (?, ?)`_, err = db.Exec(insertUser, "Alice", 30)if err != nil {log.Fatal(err)}fmt.Println("用户插入成功!")// 查询数据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 intif err := rows.Scan(&id, &name, &age); err != nil {log.Fatal(err)}fmt.Printf("用户ID: %d, 名称: %s, 年龄: %d\n", id, name, age)}// 更新数据updateUser := `UPDATE users SET age = ? WHERE name = ?`_, err = db.Exec(updateUser, 31, "Alice")if err != nil {log.Fatal(err)}fmt.Println("用户年龄更新成功!")// 删除数据deleteUser := `DELETE FROM users WHERE name = ?`_, err = db.Exec(deleteUser, "Alice")if err != nil {log.Fatal(err)}fmt.Println("用户删除成功!")
}
7. 运行流程图
以下是代码运行流程图示例:
+---------------------+
| 初始化数据库 |
| 连接字符串设置 |
+---------------------+|V
+---------------------+
| 创建数据库连接 |
+---------------------+|V
+---------------------+
| 测试连接 (Ping) |
+---------------------+|V
+---------------------+
| 执行创建表 |
+---------------------+|V
+---------------------+
| 插入用户数据 |
+---------------------+|V
+---------------------+
| 查询用户数据 |
+---------------------+|V
+---------------------+
| 更新用户年龄 |
+---------------------+|V
+---------------------+
| 删除用户 |
+---------------------+|V
+---------------------+
| 关闭数据库连接 |
+---------------------+
8. 总结
通过本节内容,你已经学习了如何在Go中连接数据库并进行基本的增、删、改、查操作。希望大家在今后的开发中能灵活运用数据库操作,提高应用的专业性和实用性。同时,建议你深入了解具体的数据库文档,并尝试在实际项目中实现复杂的数据操作。
怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!
相关文章:
15分钟学 Go 第 38 天:数据库基础
第38天 - 数据库基础 学习目标 学习如何连接和操作数据库,包括基本的增、删、改、查功能,以及如何使用Go语言中的database/sql包进行数据库交互。 内容概述 在现代应用程序中,数据库是数据持久化的重要部分。Go语言通过database/sql包提供…...
【Python】图片处理
一、获取图片尺寸 优点缺点Pillow功能丰富,支持多种图像处理操作。使用简单,适合快速原型开发。对于处理大型图像或批量图像时,性能可能不如OpenCV。OpenCV性能强大,适合处理大型图像和视频处理。提供了丰富的计算机视觉算法。相…...
面相小白的php反序列化漏洞原理剖析
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理反序列化漏洞的一些成因原理 建议学习反序列化之前 先对php基础语法与面向对象有个大体的了解 (我觉得我整理的比较细致,了解这俩是个啥就行) 漏洞实战情况 这个漏洞黑盒几乎不会被发现&am…...
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
在众多的 AI 大模型的应用场景中,Text-to-SQL,也就是文本转 SQL,是其中实用性很高的一个。Text-to-SQL 充分利用了大模型的优势,把用户提供的自然语言描述转换成 SQL 语句,还可以执行生成的 SQL 语句,再把查…...
科研绘图系列:R语言组合堆积图(stacked plot)
文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…...
YOLOv11及自研模型更新汇总
YOLOv11使用教程:YOLOv11入门到入土使用教程(含结构图) 缝合教程:深度学习模块创作(缝合)教程|适合1-360月小宝宝食用,干货满满 YOLO中的yaml文件详解:https://xy2668825911.blog.csdn.net/article/details…...
系统安全架构
一个完整的信息安全系统至少包含三类措施: 技术方面的安全措施, 管理方面的安全措施 相应的政策法律。 网络安全威胁 授权侵犯:为某一特权使用一个系统的人却将该系统用作其他未授权的目的。假冒:一个实体(人或系统)假装成另一个实体非法…...
Qt(程序打包)
Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用。 1. 设置图标 设置图标的操作步骤如下: 1. 准备好图标文件ÿ…...
牛客sql题目总结(1)
1.第N高的薪水 AC: create function getnthhighestsalary(n int) returns int begindeclare m int; set m n - 1; return (select distinct salaryfrom employeeorder by salary desclimit m, 1); end 2.平均播放进度大于60%的视频类别 AC: select tb_video_info…...
RocketMQ 自动注入消费者
目录 前言一、情景介绍二、问题分析三、代码实现 前言 之前接到一个需求,我们项目的技术负责人希望通过配置的形式,在项目启动的时候自动根据配置生成对应的消费者 觉得还有点意思,随即记录一下~ 一、情景介绍 比如我这里有一个消费者 Mes…...
RibbitMQ-安装
本文主要介绍RibbitMQ的安装 RabbitMQ依赖于Erlang,因此首先需要安装Erlang环境。分别下载erlang-26.2.5-1.el7.x86_64.rpm、rabbitmq-server-4.0.3-1.el8.noarch.rpm 官网地址:https://www.rabbitmq.com/ 官网文档:https://www.rabbitmq.c…...
非计算机背景但是想从事医学AI研究,需要掌握的编程语言|个人观点·24-11-08
小罗碎碎念 目前,我们从事医学AI研究的,接触的最多的两种编程语言应该就是R和Python了。那么初学者很容易提出一个疑问,**我想从事医学AI相关的研究的话,应该学哪些编程语言呢?**在文章的开头,我可以先给出…...
内置函数【MySQL】
文章目录 日期函数字符串函数数学函数其他函数 日期函数 current_date函数用于获取当前的日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2024-11-03 | ---------------- 1 row in set (0.00 sec)current_time函数用于获…...
RNA-seq 差异分析的点点滴滴(1)
引言 本系列[1])将开展全新的转录组分析专栏,主要针对使用DESeq2时可能出现的问题和方法进行展开。 为何使用未经标准化的计数数据? DESeq2 工具包在接收输入时,期望得到的是未经处理的原始计数数据,比如从 RNA-seq 或其他高通量测…...
Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式
Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式 1、所要用到的激活工具2、开启电脑卓越性能模式Windows11Windows10在电源模式中选择卓越性能模式 3、将系统版本切换为 工作站版本 1、所要用到的激活工具 KMS激活工具(…...
day20-21之间的项目实战:若依ruoyi开发(可以跳过)
一,项目概述 官网文档地址:http://doc.ruoyi.vip/ rouyi是一个后台管理系统,基于经典技术组合(spring boot,apache shiro,mybatis,thymeleaf)主要是让开发者注重专注业务࿰…...
双向链表及如何使用GLib的GList实现双向链表
双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助…...
ProCalun卡伦纯天然万用膏,全家的皮肤健康守护
受季节交替、生活环境变化、空气污染等方面因素的影响,加上作息不规律导致的免疫力降低,我们或多或少会出现一些如湿疹、痤疮、瘙痒之类的皮肤问题,且反复概率很高。很多人盲目用药,甚至诱发激素依赖性皮炎。所以近年来࿰…...
FastAPI全方位分析:优劣尽显
近年来,随着技术的飞速发展,快速构建高性能API的需求越来越强烈。Python作为一个广泛使用的编程语言,也在这一领域下涌现出了许多优秀的框架。FastAPI便是其中一颗璀璨的新星。 FastAPI以其卓越的性能和独特的功能吸引了众多开发者。本文将深入剖析FastAPI的各个方面,详细…...
【rust】rust基础代码案例
文章目录 代码篇HelloWorld斐波那契数列计算表达式(加减乘除)web接口 优化篇target/目录占用一个g,仅仅一个actix的helloWorld demo升级rust版本, 通过rustupcargo换源windows下放弃吧,需要额外安装1g的toolchain并且要…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
