Redian新闻
>
Go操作数据库与Gorm讲解

Go操作数据库与Gorm讲解

公众号新闻

Go连接MySQL

首先我们来看如何使用Golang连接MySQL

安装所需要的驱动

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

导入所需要使用的包

import (    "database/sql"    "fmt"    _ "github.com/go-sql-driver/mysql")

连接MySQL需要使用的语句

func main() {    //"用户名:密码@[连接方式](主机名:端口号)/数据库名"    db, _ := sql.Open("mysql", "root:pwd@(localhost)/database") // 设置连接数据库的参数    defer db.Close()                                            //关闭数据库    err := db.Ping()                                            //连接数据库    if err != nil {        fmt.Println("Open database fail !")                             //连接失败        return    }    fmt.Println("Connection succdess !")                             //连接成功}

案例演示

建表

先在MySQL中创建一个名为 test 的数据库,在此数据库中创建一个 user 表,包含五个字段id, name, age, sex, phone ,并插入几条数据,推荐使用 Navicat等图形化管理工具,不用麻烦地在 MySQL 命令行写SQL语句。表如下:

连接MySQL

将数据库的相关配置写成常量,创建 InitDB 函数用于连接数据库,创建Query 函数用于查询数据,全部代码如下:

package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/pkg/errors" "strings")
// 数据库配置const ( userName = "root" password = "******" ip = "127.0.0.1" port = "3306" dbName = "test")
// Db数据库连接池var DB *sql.DB
type User struct { id int64 name string age int8 sex int8 phone string}
// 注意方法名大写,就是publicfunc InitDB() { //构建连接:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8" path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "") //打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql" DB, _ = sql.Open("mysql", path) //设置数据库最大连接数 DB.SetConnMaxLifetime(100) //设置上数据库最大闲置连接数 DB.SetMaxIdleConns(10) //验证连接 if err := DB.Ping(); err != nil { fmt.Println("open database fail !") return } fmt.Println("connnection success !")}
// 查询操作func Query() { var user User rows, e := DB.Query("select * from user where id in (1,2,3)") if e == nil { errors.New("query incur error") } for rows.Next() { e := rows.Scan(&user.sex, &user.phone, &user.name, &user.id, &user.age) if e != nil { fmt.Println(user.sex, user.phone, user.name, user.id, user.age) } } rows.Close()}
func main() { InitDB() Query() defer DB.Close()}

以上是使用Golang连接MySQL数据库的基础方法,接下来我们看Gorm是如何连接MySQL。

Gorm

什么是ORM

对象关系映射 :Object-Relational Mapping,用于在关系数据库和面向对象编程语言的堆之间转换数据。这样就创建了一个虚拟的对象数据库,可以从编程语言内部使用。

ORM提供了自动支持,用于将元组映射到对象并返回,同时考虑所有这些差异。问题的核心在于将对象的逻辑表示转换为能够存储在数据库中的原子形式,同时保留对象的属性和它们之间的关系,以便在需要时可以重新加载为对象。如果实现了这种存储和检索功能,则称这些对象是持久的。

优点

  • 提高开发效率,减少开发成本

  • 使开发更加面向对象

  • 可移植性

  • 可以轻松引入额外功能,如数据缓存。

  • 加快开发速度 - 消除了重复的SQL代码的需要。

  • 减少开发时间、成本

  • 克服特定于供应商的SQL差异 - ORM知道如何编写特定于供应商的SQL

缺点

  • 在学习使用ORM时会损失生产力

  • 失去了对代码实际执行内容的理解 - 使用SQL时,开发人员更能控制

  • ORM有变慢的倾向

  • ORM无法与复杂查询的SQL查询竞争

Grom介绍

Gorm是一种功能强大且对开发人员友好的ORM库,支持主流的数据库。

 GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB

安装

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

连接MySQL

和基本的连接方法区别不大

import (  "gorm.io/driver/mysql"  "gorm.io/gorm")
func main() { dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})}

**注意:**想要正确的处理 time.Time ,您需要带上 parseTime 参数, ( 更多参数) 要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为 charset=utf8mb4 查看  此文章 获取详情

GORM MODEL 定义

在使用ORM工具时,我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,模型是标准的 struct,由 Go 的基本数据类型、实现了  Scanner 和  Valuer 接口的自定义类型及其指针或别名组成

约定

GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间

如果您遵循 GORM 的约定,您就可以少写的配置、代码。如果约定不符合您的实际要求, GORM 允许你配置它们

gorm.Model

GORM 定义一个 gorm.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt

// gorm.Model 的定义type Model struct {  ID        uint           `gorm:"primaryKey"`  CreatedAt time.Time  UpdatedAt time.Time  DeletedAt gorm.DeletedAt `gorm:"index"`}

您也可以将其嵌入到自己的结构体当中,如下:

type User struct {  gorm.Model  Name string}// 等效于type User struct {  ID        uint           `gorm:"primaryKey"`  CreatedAt time.Time  UpdatedAt time.Time  DeletedAt gorm.DeletedAt `gorm:"index"`  Name string}

当然您也可以完全使用自己定义的结构体,不一定需要使用它的 model


链接:https://blog.51cto.com/LowellHere/8944869

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
用一款数据库解决 80%的问题,OceanBase 的底气在哪?赢得和平但或无法凯旋的拜登总统大模型落地,向量数据库能做什么?拆解谷歌Gemini :能力可与GPT-4“掰手腕” 目前可免费使用OceanBase数据库炸场!具备OLTP完整核心功能,实验室版本不输ClickHouse明日直播|BAT资深数据分析师为你讲解2024数据求职如何成功上岸!国家数据局等17部门“数据要素×”新政:支持数据商上市融资!亿万数据市场来了?向量数据库失宠了?OpenAI 力捧检索增强生成(RAG)技术,对行业来说意味着什么?一个简单的数据库,竟然发表了这么多SCI论文!大数据分析揭示张向阳教授的分析策略为何中国实际生活水平,与GDP不符?Nucleic Acids Research | 德州学院“山东省生物物理重点实验室”发布EVLncRNAs数据库最新研究成果与Giorgio Armani共同开启一场不被定义的玩趣之旅今年向量数据库“杀疯了”,但纯向量数据库“凉”了?| 盘点中国自己的数据库CHARLS,2020年数据刚刚更新、开放使用;这里是大数据分析OpenAI开发者大会后的向量数据库和RAG,一起来这场论坛聊聊不敢把数据库运行在 K8s 上?容器化对数据库性能有影响吗?ESI数据库更新了2024年1月最新ESI数据,中国内地共有47所高校入围全球500强名单向量数据库,是大模型原生应用的基石美坛综艺秀 Purple rain--let faith lead us through国家数据局局长刘烈宏:让数据放心“供”出来 让更多数据“活”起来 让数据安全“动”起来低成本快速定制大模型,这次我们来深度探讨下RAG 和向量数据库《星级男人通鉴》第42章 脱掉你的上衣谣传易鲸捷的数据库是套牌的Oracle。。。没必要非得固守纯向量数据库!专访亚马逊云科技数据库负责人坏分子礼二哥你应该知道的主流开源数据库 | Linux 中国国产数据库们,卷死在沙滩上。。。【经典重温】数据安全纳入操作风险管理——操作风险管理办法征求意见稿点评立冬赋Oracle 数据库日常巡检指令中国数据库流行榜冠军易主!!2024数据库分水岭提前到来?NoSQL数据库使用场景以及架构介绍ChatGPT危险了!大批留学生转用新AI神器!翻译润色、文献综述、数据分析、讲解公式,啥都行!贵阳银行被大V质疑“采购假数据库”!不良率增幅位列A股城商行首位“向量数据库”还是“向量搜索插件 + SQL 数据库”?PingCAP 黄东旭:我对 2024 年数据库发展趋势的思考
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。