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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 后端实践--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和数据库的简单介绍,有兴趣的可以继续深入了解。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
28天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
52 2
|
3月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
2月前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
2月前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
59 1
|
2月前
|
存储 缓存 监控
后端性能优化:从理论到实践
在数字化时代,后端服务的性能直接影响着用户体验和业务效率。本文将深入探讨后端性能优化的重要性,分析常见的性能瓶颈,并提出一系列切实可行的优化策略。我们将从代码层面、数据库管理、缓存机制以及系统架构设计等多个维度出发,结合具体案例,详细阐述如何通过技术手段提升后端服务的响应速度和处理能力。此外,文章还将介绍一些先进的监控工具和方法,帮助开发者及时发现并解决性能问题。无论是初创公司还是大型企业,本文提供的策略都有助于构建更加高效、稳定的后端服务体系。
90 3
|
2月前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
57 1
|
2月前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
2月前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
3月前
|
消息中间件 监控 API
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,分析了其优势、实施过程中的关键考虑因素及面临的挑战。不同于传统的单体应用,微服务通过拆分功能模块为独立服务,提升了系统的灵活性和可维护性。我们将从微服务的基本概念入手,逐步剖析其在真实场景下的应用案例,并讨论如何有效应对服务间通信、数据一致性等复杂问题,旨在为开发者提供一套实用的微服务落地指南。 ####
39 0
|
3月前
|
安全 测试技术 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过一个虚构项目案例,详细阐述了从单体架构向微服务架构转型的过程、面临的挑战及解决方案。不同于常规摘要的概述性质,本文摘要旨在直接引入核心议题——如何有效实施微服务以提升系统的可扩展性、灵活性和容错能力,同时揭示转型过程中常见的技术陷阱与最佳实践策略,为读者提供实战指南。 ####
33 0