【go语言】gorm 快速入门

一、orm

1.1 什么是 orm

       ORM(对象关系映射,Object-Relational Mapping)是一种程序设计技术,用于在关系型数据库和面向对象编程语言之间进行转换和映射。ORM 允许开发者通过面向对象的方式与数据库交互,而无需直接编写复杂的 SQL 查询语句。

1.1.1 主要概念

  1. 对象与表的映射: ORM 将数据库中的表映射为程序中的对象,将表中的每一行映射为一个对象实例的属性。每个对象实例代表数据库中的一条记录。

  2. 自动生成 SQL 语句: ORM 允许开发者通过调用对象的方法来进行数据库操作(如增、删、改、查),ORM 会自动将这些操作转换为对应的 SQL 查询,减少了手动编写 SQL 语句的需要。

  3. 简化数据库操作: 使用 ORM 可以让开发者更多地专注于业务逻辑,而不是数据库的细节,使得数据库操作更加直观和高效。

1.1.2 orm 的基本操作

  • 查询:通过对象属性或方法查询数据。
  • 插入:将对象的属性值保存到数据库中。
  • 更新:修改对象的属性并将变化同步到数据库。
  • 删除:删除对象对应的数据库记录。

1.2 orm 的优缺点

1.2.1 优点

  1. 提高开发效率: ORM 通过封装数据库操作,减少了编写复杂 SQL 查询的需求,开发者可以专注于业务逻辑,而不必过多关注数据库的细节。

  2. 简化代码: ORM 通过将数据库表映射为对象,简化了增、删、改、查等操作。例如,插入数据时直接操作对象,而不需要编写 SQL 插入语句。

  3. 跨数据库支持: ORM 框架通常可以支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),如果你需要切换数据库,通常只需修改配置,而不需要重写 SQL 查询代码,节省了迁移成本。

  4. 易于维护: 由于 ORM 将数据库操作与业务逻辑分离,代码更加模块化,数据库表的修改也可以通过修改对象模型来完成,减少了代码的重复性和冗余度。

  5. 防止 SQL 注入: ORM 框架通常会自动处理 SQL 注入问题,通过参数化查询来防止恶意注入,提高了应用程序的安全性。

  6. 易于测试: ORM 提供的对象模型可以更容易进行单元测试,因为可以直接对对象进行操作而不依赖于数据库本身。这对于开发和测试过程非常重要。

1.2.2 缺点

  1. 性能开销: ORM 通过映射机制进行操作,这可能会引入一定的性能开销。例如,对于复杂查询,ORM 可能会生成不够高效的 SQL 语句,导致性能下降。

  2. 不适合复杂查询: 对于复杂的多表连接、嵌套查询等 SQL 操作,ORM 可能不如手写 SQL 来得高效。在一些性能要求较高的应用中,手写 SQL 查询可能更加合适。

  3. 学习曲线: ORM 框架通常具有一定的学习曲线,尤其是对于不熟悉 ORM 框架的开发者。要理解 ORM 的工作原理以及如何处理复杂的数据库结构,可能需要花费额外的时间和精力。

  4. 抽象层问题: ORM 框架通常会对数据库结构进行抽象,有时这种抽象并不能完全符合业务需求。开发者可能需要绕过 ORM 框架,直接编写 SQL 来解决特定问题,从而失去了 ORM 的简化优势。

  5. 维护难度: 在一些非常复杂的项目中,ORM 自动生成的代码可能变得难以调试和维护,特别是当模型变得很庞大或涉及复杂的业务逻辑时,ORM 可能会变得不那么直观。

  6. 有限的功能支持: 虽然 ORM 可以处理常见的数据库操作,但它可能无法支持一些数据库特有的高级功能(如存储过程、触发器等)。这些特殊操作可能需要直接操作 SQL,无法通过 ORM 完全处理。

1.3 如何正确看待 orm 和 sql 的关系

       ORM(对象关系映射)和 SQL(结构化查询语言)在数据库应用中是两个不同层次的概念。要正确看待它们的关系,可以从以下几个方面分析:

1.3.1 抽象层次的不同

  • ORM:ORM 是一种抽象层,它的目标是将数据库的表和行映射成面向对象的模型,方便开发者用对象的方式进行操作。开发者不再直接编写 SQL,而是通过对对象的操作来实现数据库的增、删、改、查。
  • SQL:SQL 是一种查询语言,用于直接与数据库进行交互。它描述了如何在数据库中插入、删除、更新和查询数据。SQL 更加接近底层,能够更精细地控制数据库的操作。

1.3.2 ORM 依赖于 SQL

尽管 ORM 提供了更高层次的抽象,但它最终仍然依赖于 SQL 来执行实际的数据库操作。ORM 框架将开发者的对象操作转化为 SQL 查询,然后发送给数据库。因此,ORM 本质上是在生成和执行 SQL,只是它为开发者隐藏了 SQL 的细节。

1.3.3 适用场景的差异

  • ORM:适用于大多数常规业务场景,尤其是对象和关系型数据库之间的映射较简单、SQL 查询不复杂的应用。ORM 带来的代码简化、可维护性和开发效率的提升是非常明显的。

  • SQL:适用于需要精确控制性能、进行复杂查询或处理大规模数据的场景。复杂的联接查询、多表操作、嵌套查询等情况,手写 SQL 通常能提供更高效的执行性能。而对于数据库的特殊功能(如存储过程、触发器等),ORM 可能无法完全胜任。

1.3.4 性能与灵活性

  • ORM 的性能开销:ORM 在生成 SQL 时,可能不会为特定场景生成最优的查询。对于复杂查询,生成的 SQL 可能会不够高效,从而影响性能。在这种情况下,直接编写优化后的 SQL 查询会更加高效。
  • SQL 的灵活性:SQL 给开发者提供了更大的灵活性,特别是在优化和调优查询时,开发者可以通过手写 SQL 完全控制查询的结构和执行计划。

1.3.5 开发效率与可维护性

  • ORM 的开发效率:ORM 简化了开发过程,开发者可以避免手写大量的 SQL,特别是对数据库的 CRUD 操作(增、删、改、查)部分。它提供了更简洁、更直观的方式来与数据库交互,特别适用于标准化的数据库操作。
  • SQL 的可维护性:尽管 ORM 能提升代码的可维护性,但手写 SQL 在处理特殊的查询逻辑或性能调优时,可能需要开发者对数据库有更深入的理解。随着项目的复杂性增加,手写 SQL 可以提供更高的可定制性和维护性,特别是在数据库结构或查询需求变化时。

1.3.6 灵活性和控制

  • ORM 的限制:虽然 ORM 提供了自动化的数据库操作,但它的抽象有时可能不符合复杂的业务需求。比如,ORM 在执行一些复杂的关联查询或批量操作时,可能会引入额外的查询和性能开销。在这些情况下,手写 SQL 可以更加高效和灵活。
  • SQL 的控制力:使用 SQL,开发者对查询的执行过程、性能优化和数据库的特殊操作有完全的控制权。手写 SQL 可以根据需要调整查询的执行顺序、索引使用等,从而在性能方面做到更精细的调优。

1.3.7 结合使用

在实际开发中,ORM 和 SQL 并不是对立的。许多情况下,开发者可以将它们结合起来使用:

  • ORM 用于常见操作:对于常规的增、删、改、查等操作,ORM 可以提供快速的开发体验。
  • SQL 用于复杂查询和优化:对于复杂的多表联接、性能敏感的查询、数据库的特殊功能,开发者可以直接编写 SQL,或者在 ORM 框架中直接嵌入 SQL 来满足需求。

1.3.8 总结

  • ORM 是一种抽象层,旨在简化与数据库的交互,使开发者能够以面向对象的方式进行操作,适用于大多数简单的应用场景。
  • SQL 是一种底层的查询语言,直接与数据库交互,提供了更高的灵活性、性能优化和控制权,适合复杂的查询和高性能要求的场景。

二、gorm 连接数据库

2.1 安装 GORM 包

首先,你需要安装GORM库。可以通过以下命令安装:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite  # 如果你使用 SQLite
go get -u gorm.io/driver/mysql   # 如果你使用 MySQL
go get -u gorm.io/driver/postgres # 如果你使用 PostgreSQL

2.2 编写连接代码

       下面是一个简单的例子,展示如何连接MySQL数据库。你可以根据需要修改为其他类型的数据库连接。

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log"
)func main() {// 设置数据库连接字符串dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"// 连接数据库db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatal("failed to connect to the database:", err)}log.Println("Database connection established successfully!")// 你可以在这里执行数据库操作,比如迁移或CRUD操作
}
  • dsn: 数据库连接字符串。user 和 password 是你的MySQL用户名和密码,127.0.0.1:3306 是数据库地址和端口,dbname 是你要连接的数据库名称。
  • gorm.Open(): 用于连接数据库,第二个参数是数据库驱动。
  1. username:password:数据库的用户名和密码
  2. @protocol(address) :指定连接协议和数据库服务器的地址。
  3. /dbname:要连接的数据库名

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

2.3 执行数据库迁移

      在连接数据库后,你可以使用GORM的自动迁移功能创建数据库表。YourModel 是你定义的模型(struct)。

db.AutoMigrate(&YourModel{})

2.4 高级设置

MySQL 驱动程序提供了 一些高级配置 可以在初始化过程中使用,例如:

db, err := gorm.Open(mysql.New(mysql.Config{DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source nameDefaultStringSize: 256, // string 类型字段的默认长度DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})

三、快速体验一下 CRUD

{// Createdb.Create(&Product{Code: "D42", Price: 100})// Readvar product Productdb.First(&product, 1) // 根据整型主键查找db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录// Update - 将 product 的 price 更新为 200db.Model(&product).Update("Price", 200)// Update - 更新多个字段db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})// Delete - 删除 productdb.Delete(&product, 1)
}

在上述代码中,我们在执行完数据库迁移之后,就可以进行数据库的增删查改操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9852.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenEuler学习笔记(十七):OpenEuler搭建Redis高可用生产环境

在OpenEuler上搭建Redis高可用生产环境,通常可以采用Redis Sentinel或Redis Cluster两种方式,以下分别介绍两种方式的搭建步骤: 基于Redis Sentinel的高可用环境搭建 安装Redis 配置软件源:可以使用OpenEuler的默认软件源&#…

【编译原理实验二】——自动机实验:NFA转DFA并最小化

本篇适用于ZZU的编译原理课程实验二——自动机实验:NFA转DFA并最小化,包含了实验代码和实验报告的内容,读者可根据需要参考完成自己的程序设计。 如果是ZZU的学弟学妹看到这篇,那么恭喜你,你来对地方啦! 如…

我的2024年博客总结(在工作、博客和生活中找到自己的生活节奏)

文章目录 ⭐前言⭐工作和博客的关联⭐找到自己的生活节奏⭐结束 ⭐前言 大家好,我是yma16,本文主要写2024年博客总结,关于在工作、博客和生活中找到自己的生活节奏。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置…

RDK X5运行DeepSeek-R1-Distill-Qwen-1.5B,体验长思维链的语言大模型!

简介 本文介绍了在RDK X5上,如何从HuggingFace的原始模型权重(safetensors)经过量化和编译,的到llama.cpp推理框架所需要的GGUF格式的模型,然后演示了如何使用llama.cpp运行量化后的DeepSeek-R1-Distill-Qwen-1.5B模型…

巴塞尔问题详解:计算所有正整数平方的倒数之和

1 相关历史背景 巴塞尔问题(Basel Problem)是数学史上一个著名的问题,由意大利数学家皮埃特罗门戈利(Pietro Mengoli)在1644年首次提出。 但他未能解决,只能给出小数点后六位的近似解是1.644934&#xff0…

神经网络和深度学习

应用 类型 为什么近几年飞速发展 数据增长,算力增长,算法革新 逻辑回归 向量化 浅层神经网络(Shallow neural network) 单条训练数据前向传播计算表达式 batch训练数据前向传播计算表达式 反向传播计算表达式 参数随机初始化 不能全部设为0 原因是同一…

python3+TensorFlow 2.x(三)手写数字识别

目录 代码实现 模型解析: 1、加载 MNIST 数据集: 2、数据预处理: 3、构建神经网络模型: 4、编译模型: 5、训练模型: 6、评估模型: 7、预测和可视化结果: 输出结果&#xff…

AI大模型开发原理篇-8:Transformer模型

近几年人工智能之所以能迅猛发展,主要是靠2个核心思想:注意力机制Attention Mechanism 和 Transformer模型。本次来浅谈下Transformer模型。 重要性 Transformer模型在自然语言处理领域具有极其重要的地位,为NLP带来了革命性的突破‌。可以…

探索性测试与自动化测试的结合

随着软件开发周期的不断缩短和质量要求的不断提高,测试行业正在经历一场深刻的变革。自动化测试因其高效性和可重复性成为测试团队必不可少的工具,而探索性测试(Exploratory Testing, ET)则因其灵活性和创意性在面对复杂、动态变化…

C28.【C++ Cont】顺序表的实现

🧨🧨🧨🧨🧨🧨🧨🧨🧨初二篇🧨🧨🧨🧨🧨🧨🧨🧨🧨 目录 1.知识回顾…

【Redis】 String 类型的介绍和常用命令

1. 介绍 Redis 中的 key 都是字符串类型Redis 中存储字符串是完全按照二进制流的形式保存的,所以 Redis 是不处理字符集编码的问题,客户端传入的命令中使用的是什么编码就采用什么编码,使得 Redis 能够处理各种类型的数据,包括文…

QT设置应用程序图标

在线将png等图片转换成:在线生成透明ICO图标——ICO图标制作https://www.ico51.cn/ 将转换成的.ico图片添加到资源文件:

【视频+图文详解】HTML基础3-html常用标签

图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>&#xff1a;声明HTML文档类型。<html>&#xff1a;定义HTML文档的根元素。<head>&#xff1a;定义文档头部&#xff0c;包含元数据。<title>&#xff1a;设置网页标题&#xff0c;浏览…

回顾:Maven的环境搭建

1、下载apache-maven-3.6.0 **网址:**http://maven.apache.org 然后解压到指定的文件夹&#xff08;记住文件路径&#xff09; 2、配置Maven环境 复制bin文件夹 的路径D:\JavaTool\apache-maven-3.6.0\bin 环境配置成功 3、检查是否配置成功 winR 输入cmd 命令行输入mvn -v…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略

1.30 性能巅峰&#xff1a;NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …

白嫖DeepSeek:一分钟完成本地部署AI

1. 必备软件 LM-Studio 大模型客户端DeepSeek-R1 模型文件 LM-Studio 是一个支持众多流行模型的AI客户端&#xff0c;DeepSeek是最新流行的堪比GPT-o1的开源AI大模型。 2. 下载软件和模型文件 2.1 下载LM-Studio 官方网址&#xff1a;https://lmstudio.ai 打开官网&#x…

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4&#xff1a;习题5&#xff1a; 知识点 C的STL提供已经封装好的容器vector&#xff0c;也可叫做可变长的数组&#xff0c;vector底层就是自动扩容的顺序表&#xff0c;其中的增删查改已经封装好 创建 const int N30; vecto…

mysql_init和mysql_real_connect的形象化认识

解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体&#xff0c;为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息&#xff0c;是 MySQL C API 的核心句柄。 示例&#xff1a; MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…

C++中常用的排序方法之——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的…

ARM嵌入式学习--第十天(UART)

--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器&#xff0c;是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用来与PC进行通信&#xff0c;包括与监控…