百亿数据百亿花, 库若恒河沙复沙,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang数据库操作实践EP12

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Golang可以通过Gorm包来操作数据库,所谓ORM,即Object Relational Mapping(数据关系映射),说白了就是通过模式化的语法来操作数据库的行对象或者表对象,对比相对灵活繁复的SQL语句,ORM上手简单,通用性较高,但是在性能层面略有损耗,Gorm的底层是结构体对象,关于结构体,请移玉步至:[你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06](https://v3u.cn/a_id_229)。

Golang可以通过Gorm包来操作数据库,所谓ORM,即Object Relational Mapping(数据关系映射),说白了就是通过模式化的语法来操作数据库的行对象或者表对象,对比相对灵活繁复的SQL语句,ORM上手简单,通用性较高,但是在性能层面略有损耗,Gorm的底层是结构体对象,关于结构体,请移玉步至:你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

Gorm的安装与配置

首先如果要使用Gorm操作数据库,得先有数据库才行,这里为了全平台统一标准,我们使用Docker来安装Mysql数据库,Docker的安装请参见:一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群,运行命令运行mysql容器:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.19
AI 代码解读

注意这里如果宿主机已经有Mysql服务了,需要将:左边的端口号错开,改成3307或者其他什么端口。

随后在终端运行命令安装Gorm包:

go get -u github.com/jinzhu/gorm
AI 代码解读

这里-u参数的意思是使用较新的版本

随后安装Mysql数据库链接驱动包:

go get -u github.com/go-sql-driver/mysql
AI 代码解读

接着在任意位置编写test.go脚本:

package main  
  
import (  
    "fmt"  
    "github.com/jinzhu/gorm"  
    _ "github.com/jinzhu/gorm/dialects/mysql"  
)  
  
func main() {  
    db, err := gorm.Open("mysql", "root:root@(localhost)/mytest?charset=utf8mb4&parseTime=True&loc=Local")  
  
    if err != nil {
                fmt.Println(err)
               fmt.Println("连接数据库出错")  
        return  
    }  
  
    defer db.Close()
        fmt.Println("链接Mysql成功")  
}
AI 代码解读

这里导入输出包和Gorm包,同时通过下划线的形式导入mysql驱动包,这样做的好处是mysql驱动的init()函数会在被导入时执行,因为我们并不需要驱动包的具体模块或者函数,而仅仅是用它连一下数据库而已。

随后,创建结构体变量db,注意Open函数对应的Mysql参数是否正确。

注意,结构体变量赋值过程中如果报错,需要判断err变量内容,并且使用return关键字提前结束逻辑,关于golang的错误处理,可参见:人非圣贤孰能无过,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang错误处理机制EP11

最后,使用defer关键字在所有逻辑执行后关闭Mysql数据库链接。

编译执行后,程序返回:

链接Mysql成功
AI 代码解读

当然Gorm并不仅仅只能操作Mysql,其他主流数据库也都支持,比方说Sqllite3,事实上,在成本有限或者缓存体系比较完备的情况下,Sqllite3完全可以替代Mysql,首先安装sqllite3驱动:

go get -u github.com/jinzhu/gorm/dialects/sqlite
AI 代码解读

然后修改test.go文件:

package main  
  
import (  
    "fmt"  
  
    "github.com/jinzhu/gorm"  
    //_ "github.com/jinzhu/gorm/dialects/mysql"  
    _ "github.com/jinzhu/gorm/dialects/sqlite"  
)  
  
func main() {  
    //db, err := gorm.Open("mysql", "root:root@(localhost)/mytest?charset=utf8mb4&parseTime=True&loc=Local")  
  
    db, err := gorm.Open("sqlite3", "/tmp/gorm.db")  
  
    if err != nil {  
        fmt.Println(err)  
        fmt.Println("连接数据库出错")  
        return  
    }  
  
    defer db.Close()  
  
    fmt.Println("链接sqllite3成功")  
}
AI 代码解读

编译执行后返回:

链接sqllite3成功
AI 代码解读

数据库操作

连接好数据库之后,我们就可以做一些数据库层面的操作了,比如程序层面的数据库迁移操作:

// 文章信息  
type ArticleInfo struct {  
    ID     uint  
    Title  string  
    Author string  
}
AI 代码解读

这里建立文章表的结构体数据,随后编写迁移逻辑:

//数据迁移  
db.AutoMigrate(&ArticleInfo{})  
fmt.Println("表创建成功")
AI 代码解读

进入Mysql命令行,输入命令:

MySQL [(none)]> use mytest;  
Database changed  
MySQL [mytest]> desc article_infos  
    -> ;  
+--------+------------------+------+-----+---------+----------------+  
| Field  | Type             | Null | Key | Default | Extra          |  
+--------+------------------+------+-----+---------+----------------+  
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |  
| title  | varchar(255)     | YES  |     | NULL    |                |  
| author | varchar(255)     | YES  |     | NULL    |                |  
+--------+------------------+------+-----+---------+----------------+  
3 rows in set (0.03 sec)  
  
MySQL [mytest]>
AI 代码解读

没有问题。

创建数据:

a1 := ArticleInfo{1, "iris", "iris"}  
a2 := ArticleInfo{2, "iris", "女"}  
// 创建记录  
db.Create(&a1)  
db.Create(&a2)
AI 代码解读

这里我们声明两个结构体变量,然后将其指针传递给db变量的Create函数,编译运行后,键入命令进行查询操作:

MySQL [mytest]> select * from article_infos\g  
+----+-------+--------+  
| id | title | author |  
+----+-------+--------+  
|  1 | iris  | iris   |  
|  2 | iris  ||  
+----+-------+--------+
AI 代码解读

随后,将刚才入库的数据查询出来:

// 查询  
a := new(ArticleInfo)  
db.First(a)  
fmt.Println(a)
AI 代码解读

这里通过new关键字初始化结构体,然后使用First函数获取第一条记录。

程序返回:

链接mysql成功  
&{1 iris iris}
AI 代码解读

查出来的结构体指针可以直接用来做修改操作:

// 查询  
    a := new(ArticleInfo)  
    db.First(a)  
    fmt.Println(a)  
  
    //修改  
    db.Model(&a).Update("Author", "123")  
  
    fmt.Println(a)
AI 代码解读

程序返回:

链接mysql成功  
&{1 iris iris}  
&{1 iris 123}
AI 代码解读

非常方便。

最后,是删除操作:

// 删除  
db.Delete(&a)
AI 代码解读

这里通过指针传入Delete函数即可:

MySQL [mytest]> select * from article_infos\g  
+----+-------+--------+  
| id | title | author |  
+----+-------+--------+  
|  2 | iris  ||
AI 代码解读

该条记录已经被物理删除。

执行原生SQL

如果我们需要执行原生的sql语句,Gorm也提供了对应的函数:

var articles []ArticleInfo  
//   查询 执行用Scan 和Find 一样  
db = db.Raw("select * from article_infos ").Scan(&articles)  
fmt.Println(articles)
AI 代码解读

这里只需要声明文章的结构体变量,然后执行Scan函数即可:

[{2 iris 女} {3 iris iris} {4 iris 女}]
AI 代码解读

这里会返回一个切片嵌套结构体的结果集。

除此之外,更新和删除操作:

//  更新和删除.插入用 Exec  
db = db.Exec("update article_infos set author='123' where id = 2")  
fmt.Println("更新了", db.RowsAffected, "条数据")  
db = db.Exec("delete from article_infos where id=4")  
fmt.Println("更新了", db.RowsAffected, "条数据")
AI 代码解读

程序返回:

[]main.ArticleInfo更新了 1 条数据  
更新了 1 条数据
AI 代码解读

结语

目前Golang的比较流行的ORM包除了Gorm,还有Xorm,对比Python数据库ORM的百花齐放,百家争鸣,Go lang还有很长的一段路需要走,真实环境下的数据库操作也不仅仅是增删改查,更多操作请移步Gorm官方文档:https://gorm.io/zh\_CN/docs/

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
1681
分享
相关文章
代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践
通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。
Go 切片导致 rand.Shuffle 产生重复数据的原因与解决方案
在 Go 语言开发中,使用切片时由于其底层数据共享特性,可能会引发意想不到的 Bug。本文分析了 `rand.Shuffle` 后切片数据重复的问题,指出原因在于切片是引用类型,直接赋值会导致底层数组共享,进而影响原始数据。解决方案是使用 `append` 进行数据拷贝,确保独立副本,避免 `rand.Shuffle` 影响原始数据。总结强调了切片作为引用类型的特性及正确处理方法,确保代码稳定性和正确性。
119 82
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
139 19
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
72 11
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
104 0
|
4月前
|
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
107 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等