后端实践--go与数据库 青训营

简介: 后端实践--go与数据库 青训营

go与数据库

数据库在后端开发中十分重要,这篇博客主要总结用go去操作数据库的相关知识。包括数据库的简单介绍,重点是用go控制MySQL

1. 数据库简介

关系型数据库:MySQLSQLlite(嵌入式)、postgreSQL...... 用表存一类数据。

1. SQL 语句

DDL

DML

DCL

2. 存储引擎

常见的如MYISAMInnoDB

3. 索引

略。

4. 事务

ACID 四个特性。四个隔离级别。

5. go操作MySQL

go自带的包:database/sql 原生支持连接池并且是并发安全的。

没有具体的实现,列出了一些实现标准。

下载mysql依赖:go get ... 相关方法实现在这里。

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

连接数据库:sql.Open()db.Ping()

// 全局
var db *sql.DB
// 数据库用户名:密码@连接对象/具体哪一个数据库
dsn := "root:m3479735881@tcp(127.0.0.1:3306)/go_study"
// Open 时不校验用户名和密码,而是检查dsn的格式,返回值db就是一个数据库的连接池
// 这里一定不是 := ,因为前面声明过了!
db, err = sql.Open("mysql", dsn)
if err != nil {
  return
}
// 这里校验
err = db.Ping()
if err != nil {
  return
}
// 可以设置db这个数据库连接池中连接的最大个数
db.SetMaxOpenConns(10)
// 设置最大闲置连接数
// db.SetMaxIdleConns(8)

db对象放在全局,这样各个函数里就可以共享。db就像是一个句柄,里面有数据库的相关信息。

单行查询:db.QueryRow()

// 全局
type stu struct {
  id   int
  name string
  age  int
}
var stu1 stu
// 1. 查询
sqlStr := "select id,name,age from student where id=?;"
// 从连接池中取出一个连接去查询。
ret := db.QueryRow(sqlStr, i)
// 取出结果放到结构体里,同时Scan内部会释放连接!  !所以一般必须调用Scan释放连接
ret.Scan(&stu1.id, &stu1.name, &stu1.age)
fmt.Printf("%#v\n", stu1

需要注意最后一定要调用Scan ,因为Scan 内部会释放该连接,不释放就会造成连接浪费。

多行查询:db.Query()

sqlStr := "select id,name,age from student where id > ?;"
rets, err := db.Query(sqlStr, i)
if err != nil {
  fmt.Printf("Query error:%#v\n", err)
  return
}
// 这个要自己手动关闭!
defer rets.Close()
// 循环取值
var stu1 stu
for rets.Next() {
  rets.Scan(&stu1.id, &stu1.name, &stu1.age)
  fmt.Printf("%#v\n", stu1)
}

一定注意使用的连接要手动关闭!

插入数据、更新数据、删除数据:db.Exec()

// 插入数据
sqlStr := "insert into student values (?, ?, ?)"
req, err := db.Exec(sqlStr, id, name, age)
if err != nil {
  fmt.Printf("Exec error:%#v\n", err)
  return
}
// 获取插入数据的ID
req.LastInsertId()
// 获取受影响的行数
req.RowsAffected()
// 修改数据
sqlStr := "update student set age=1111 where id=1;"
res, err := db.Exec(sqlStr)
if err != nil {
  fmt.Printf("Exec error:%#v\n", err)
  return
}
// 获取修改数据的ID
res.LastInsertId()
// 获取受影响的行数
res.RowsAffected()
// 删除数据
// 差别不大!!!

6. MySQL的预处理

把多条SQL语句的命令部分和数据部分 分开发给服务端,可以对同一类的语句做优化,提升效率。还可以避免SQL注入问题。适用于批量处理同一类的语句。

普通SQL语句执行过程:

  1. 客户端对SQL语句进行占位符替换得到完整的SQL语句。
  2. 客户端发送完整SQL语句到MySQL服务端
  3. MySQL服务端执行完整的SQL语句并将结果返回给客户端。

预处理执行过程:

  1. SQL语句分成两部分,命令部分与数据部分。
  2. 先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预处理。
  3. 然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换。
  4. MySQL服务端执行完整的SQL语句并将结果返回给客户端。
sqlStr := "insert into student values (?,?,?)"
// 预处理
stmt, err := db.Prepare(sqlStr)
if err != nil {
  fmt.Printf("prepare error:%#v\n", err)
  return
}
defer stmt.Close()
// 插入,填入之前的占位符即可
req, err := stmt.Exec(10, "asdfsadf", 123)
if err != nil {
  fmt.Printf("prepare error:%#v\n", err)
  return
}
req.LastInsertId()
// req.RowsAffected()

7. MySQL注入

==永远不要自己拼接SQL 语句!!==

// 自己拼接:
func select(name string){
  // 拼接,这时若name乱搞,就可能会有问题!!
  sqlStr := fmt.Sprintf("select id,name from student where name=%s", name)
}

8. sqlx使用

是对标准库database/sql 的替代。需要安装依赖。

就是比标准库的某些基础操作简单一点点。其实就用标准库就行。

2. Redis

KV数据库

下载第三方依赖:

go get github.com/go-redis/redis/v8

3. NSQ

分布式==消息队列。==

支持横向扩展;支持容错和高可用性;提供可靠的消息交付保证。

使用场景:同步处理转为异步处理(异步化);应用解耦;流量削峰(某一时刻流量非常大时提供一定的缓冲).......

以上就是go和数据库的简单介绍,有兴趣的可以继续深入了解。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
人工智能 运维 关系型数据库
云栖大会|AI时代的数据库变革升级与实践:Data+AI驱动企业智能新范式
2025云栖大会“AI时代的数据库变革”专场,阿里云瑶池联合B站、小鹏、NVIDIA等分享Data+AI融合实践,发布PolarDB湖库一体化、ApsaraDB Agent等创新成果,全面展现数据库在多模态、智能体、具身智能等场景的技术演进与落地。
|
2月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
3月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
204 8
|
9月前
|
人工智能 前端开发 JavaScript
代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践
通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。
|
5月前
|
人工智能 运维 数据挖掘
瑶池数据库Data+AI驱动的全栈智能实践开放日回顾
阿里云瑶池数据库重磅推出“Data+AI能力家族”,包括DTS AI数据准备、Data Agent系列智能体及DMS MCP统一数据访问服务,重构数据与AI协同边界。通过智能化工具链,覆盖数据全生命周期,提升企业数据开发、分析、治理与运维效率,降低技术门槛,激活数据资产价值,助力企业迈向全栈智能新时代。
|
7月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
452 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
6月前
|
人工智能 运维 数据挖掘
瑶池数据库开放日:全新发布Data+AI能力家族,赋能企业全栈智能实践
近日,阿里云瑶池数据库生态工具产品重磅升级,推出“Data+AI能力家族”,并举办了为期3天的全栈智能实践开放日活动。发布会上首次公开了 “Data Agent for Analytics、Data Agent for Meta、DAS Agent”等瑶池数据库Data Agent系列能力,以工具智能化 × 智能化工具的双引擎重构数据与AI的协同边界,揭秘AI时代数据价值释放的全新路径。
|
11月前
|
关系型数据库 OLAP API
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
631 19
|
9月前
|
数据库
|
11月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
288 11

热门文章

最新文章