go语言Gin框架的学习路线(七)

 GORM入门(基于七米老师)

目录

GORM入门

安装

连接数据库

连接MySQL

连接PostgreSQL

连接Sqlite3

连接SQL Server

我们搞一个连接MySQL的例子

创建数据库

GORM操作MySQL


GORM是一个流行的Go语言ORM(对象关系映射)库,它提供了一种方法来操作数据库,使得开发者可以用Go语言的代码来操作数据库,而不需要编写SQL语句。GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite、SQL Server等

以下是GORM的一些主要特性:

  1. 链式操作:GORM的链式操作使得代码更加简洁和易于阅读。
  2. 自动迁移:GORM可以自动检测模型的变化并更新数据库结构。
  3. 事务支持:GORM支持事务,确保数据的一致性。
  4. 关联模型:GORM支持多种关联关系,如一对一、一对多、多对多等。
  5. 预加载:GORM支持预加载关联数据,减少数据库查询次数。
  6. 条件查询:GORM提供了丰富的条件查询接口,方便进行复杂的数据查询。
  7. 钩子函数:GORM支持在数据的创建、更新、删除等操作前后执行自定义的代码。
  8. 插件系统:GORM有一套插件系统,可以扩展其功能。

使用GORM,你可以定义一个结构体来表示数据库中的一个表,然后通过这个结构体来操作数据库中的数据。

安装

go get -u github.com/jinzhu/gorm

连接数据库

按如下方式导入需要的数据库驱动即可

import _ "github.com/jinzhu/gorm/dialects/mysql"
import _ "github.com/jinzhu/gorm/dialects/postgres"
import _ "github.com/jinzhu/gorm/dialects/sqlite"
import _ "github.com/jinzhu/gorm/dialects/mssql"

在Go语言中,import语句用来导入包以便在代码中使用。在上述代码中import语句使用了下划线_作为别名,这是一种特殊的用法,表示导入包是为了执行包的初始化代码,而不是为了在当前文件中直接使用包中的导出符号(函数、类型、变量等)。使用这种方式导入方言包,通常是在应用程序的入口文件中进行,例如main.go或应用程序的配置文件中。这样做的好处是,即使你的应用程序只使用一种数据库,你也可以通过简单地导入相应的方言包来支持多种数据库,而不需要修改大量的代码。此外,这也有助于保持代码的组织性和可维护性

连接MySQL

import ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)func main() {db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")defer db.Close()
}

这段代码的主要目的是建立与MySQL数据库的连接。如果连接成功,db变量将包含数据库的连接对象,你可以使用这个对象来进行数据库操作,如查询、更新、插入和删除等。如果连接失败,err变量将包含错误信息,你可以检查这个变量来了解连接失败的原因。

连接PostgreSQL

import ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/postgres"
)func main() {db, err := gorm.Open("postgres", "host=myhost port=myport user=gorm dbname=gorm password=mypassword")defer db.Close()
}

这段代码的主要目的是建立与PostgreSQL数据库的连接。如果连接成功,db变量将包含数据库的连接对象,你可以使用这个对象来进行数据库操作,如查询、更新、插入和删除等。如果连接失败,err变量将包含错误信息,你可以检查这个变量来了解连接失败的原因。 

连接Sqlite3

import ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/sqlite"
)func main() {db, err := gorm.Open("sqlite3", "/tmp/gorm.db")defer db.Close()
}

这段代码的主要目的是建立与SQLite数据库的连接。如果连接成功,db变量将包含数据库的连接对象,你可以使用这个对象来进行数据库操作,如查询、更新、插入和删除等。如果连接失败,err变量将包含错误信息,你可以检查这个变量来了解连接失败的原因。 

连接SQL Server

import ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mssql"
)func main() {db, err := gorm.Open("mssql", "sqlserver://username:password@localhost:1433?database=dbname")defer db.Close()
}

这段代码的主要目的是建立与Microsoft SQL Server数据库的连接。如果连接成功,db变量将包含数据库的连接对象,你可以使用这个对象来进行数据库操作,如查询、更新、插入和删除等。如果连接失败,err变量将包含错误信息,你可以检查这个变量来了解连接失败的原因。 

我们搞一个连接MySQL的例子

创建数据库

在使用GORM前手动创建数据库db1

CREATE DATABASE db1;
GORM操作MySQL
package mainimport ("fmt""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql" // 导入MySQL方言包,注册MySQL方言
)// UserInfo 定义用户信息的结构体
type UserInfo struct {ID     uint   // 用户IDName   string // 用户姓名Gender string // 用户性别Hobby  string // 用户爱好
}func main() {// 使用GORM打开与MySQL数据库的连接db, err := gorm.Open("mysql", "root:root1234@(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local")// 检查连接是否有误,如果有误则打印错误并终止程序if err != nil {panic(err)}defer db.Close() // 确保在函数结束时关闭数据库连接// 使用AutoMigrate自动迁移UserInfo结构体到数据库,如果表不存在则创建db.AutoMigrate(&UserInfo{})// 创建两个用户信息实例u1 := UserInfo{1, "亨亨", "男", "打篮球"}u2 := UserInfo{2, "小欣", "女", "打羽毛球"}// 使用Create方法创建记录到数据库中db.Create(&u1)db.Create(&u2)// 查询操作:查询第一条记录var u = new(UserInfo)db.First(u)            // 查询结果赋值给变量ufmt.Printf("%#v\n", u) // 打印查询结果// 根据条件查询记录var uu UserInfodb.Find(&uu, "hobby=?", "打羽毛球") // 查询爱好为足球的用户信息fmt.Printf("%#v\n", uu)       // 打印查询结果// 更新操作:更新用户爱好为双色球db.Model(&u).Update("hobby", "双色球") // 通过Model指定更新对象,然后调用Update进行更新// 删除操作:删除指定的用户记录db.Delete(&u) // 通过Delete删除u指向的记录
}

这段代码是一个使用Go语言和GORM库来操作MySQL数据库的示例。下面是对代码的理解和简单记忆的方法:

  1. 包导入

    • 导入GORM库和MySQL方言包,使用下划线表示不直接使用包的内容,而是执行包的初始化代码。
  2. 定义结构体

    • UserInfo结构体代表数据库中的用户信息表,包含ID、姓名、性别和爱好四个字段。
  3. 主函数

    • main()是程序的入口点。
  4. 数据库连接

    • 使用gorm.Open函数连接到MySQL数据库,如果连接失败,使用panic终止程序。
  5. 自动迁移

    • AutoMigrate方法自动创建或修改数据库表以匹配UserInfo结构体。
  6. 创建记录

    • 创建两个UserInfo实例u1u2,然后使用Create方法将它们添加到数据库中。
  7. 查询记录

    • 使用First方法查询并打印数据库中的第一条记录。
    • 使用Find方法根据条件查询并打印特定记录(爱好为“打羽毛球”的用户)。
  8. 更新记录

    • 使用ModelUpdate方法更新指定记录的爱好字段为“双色球”。
  9. 删除记录

    • 使用Delete方法删除指定的记录。

简单记忆方法

  • 包导入:GORM和方言包。
  • 结构体:定义了数据库表的结构。
  • 连接gorm.Open连接数据库。
  • 迁移AutoMigrate创建或更新表。
  • Create添加记录。
  • FirstFind查询记录。
  • Model.Update更新记录。
  • Delete删除记录。

记住CRUD(创建Create、读取Read、更新Update、删除Delete)操作,这是数据库操作的基本流程。通过这个流程,你可以快速回忆起代码的各个部分。

  期末放假自学Gin框架,希望我们可以一起学习!

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

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

相关文章

Haproxy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

IAR环境下STM32+IAP方案的实现

--基于STM32F103ZET6的UART通讯实现 一、什么是IAP,为什么要IAP IAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使…

【C++】 string类的模拟实现

目录 一、我们先创建三个文件分别为 String.h(声明)、String.cpp(定义)、teat.cpp(测试) 二、成员函数 构造函数与析构函数 🌟string() 🌟string(const char* str) &#x1f…

YOLO 模型基础入门及官方示例演示

文章目录 Github官网简介模式数据集Python 环境Conda 环境Docker 环境部署 CPU 版本官方 CLI 示例官方 Python 示例 任务目标检测姿势估计图像分类 Ultralytics HUB视频流示例 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttp…

python-网络并发模型

3. 网络并发模型 3.1 网络并发模型概述 什么是网络并发 在实际工作中,一个服务端程序往往要应对多个客户端同时发起访问的情况。如果让服务端程序能够更好的同时满足更多客户端网络请求的情形,这就是并发网络模型。 循环网络模型问题 循环网络模型只能…

跨平台WPF音乐商店应用程序

目录 一 简介 二 设计思路 三 源码 一 简介 支持在线检索音乐,支持实时浏览当前收藏的音乐及音乐数据的持久化。 二 设计思路 采用MVVM架构,前后端分离,子界面弹出始终位于主界面的中心。 三 源码 视窗引导启动源码: namesp…

知名在线市场 Etsy 允许在其平台上销售 AI 艺术品,但有条件限制|TodayAI

近日,以手工和复古商品著称的在线市场 Etsy 宣布,将允许在其平台上销售 AI 生成的艺术品。这一举措引发了广泛关注和争议。尽管 Etsy 正在接受 AI 艺术的潮流,但平台对这一类商品的销售设置了一些限制。 根据 Etsy 新发布的政策,…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动TFT大屏_I2C_HW参考代码(v1.3) 硬件I2C方式

本篇介绍单片机使用硬件I2C方式控制RA8889驱动彩屏。 提供STC8H8K64U和STC8051U34K64的参考代码。 【硬件部份】STC8H8K64U/STC8051U34K64 RA8889开发板 7寸TFT 800x480 1. 实物连接图:STC8H8K64URA8889开发板,使用P2口I2C接口: 2.实物连…

【QT】信号与槽(概述、使用、自定义、连接方式、其他说明)

一、信号和槽概述 在 Qt 中,用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是一个事件,“用户关闭窗口” 也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出 “按钮被点击” 的信号,用户关闭窗口…

windows edge自带的pdf分割工具(功能)

WPS分割pdf得会员,要充值!网上一顿乱找,发现最简单,最好用,免费的还是回到Windows。 Windows上直接在edge浏览器打开PDF,点击 打印 按钮,页面下选择对应页数 打印机 选择 另存为PDF,然后保存就…

记录一下在Hyper-v中动态磁盘在Ubuntu中不完全用到的问题(扩展根目录)

在之前给hyper虚拟机的Ubuntu分配磁盘有20G; 后来在Ubuntu中查看磁盘发现有一个分区没用到: 贴的图片是完成扩展后的 之前这里是10G,然后有个dev/sda4的分区,也是10G,Type是Microsoft Basic Data; …

【LeetCode】填充每个节点的下一个右侧节点指针 II

目录 一、题目二、解法完整代码 一、题目 给定一个二叉树: struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NUL…

spring security源码追踪理解(一)

一、前言 近期看了spring security相关的介绍,再加上项目所用若依框架的底层安全模块也是spring security,所以想从源码的角度加深下对该安全模块的理解(看源码之前,我们要先有个意识,那就是spring security安全模块主…

【面试题】Redo log和Undo log

Redo log 介绍Redo log之前我们需要了解一下,mysql数据操作的流程: 上述就是数据操作的流程图,可以发现sql语句并不是直接操作的磁盘而是通过操作内存,然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域: 缓…

c++基础(类和对象中)(类的默认成员函数)

目录 一.构造函数(类似初始化) 1.概念 2.构造函数的特点 二.析构函数(类似 销毁对象/空间) 三.拷贝构造函数(类似复制粘贴的一种 初始化 ) 1.概念: 2.拷贝构造的特点: 四.赋值运算符重载&#xff08…

IDEA的工程与模块管理

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …

STM32的ADC详解

目录 一、ADC简介 二、ADC的时钟 三、ADC特性 四、ADC功能说明 五、规则通道和注入通道 1.规则通道 2.注入通道 3.区别 六、数据寄存器 1.右对齐 2.左对齐 七、转换模式 1.单次转换模式 2.续转换模式 3.扫描模式 4.区别 八、程序实现 1.需求 2.ADC初始化 3.A…

ipv6 基础学习(一)

IPv6 为什么要有IPV6? IPv4地址空间有限:IPv4使用32位地址,最多可提供约43亿个地址。随着互联网设备数量的爆炸式增长,这些地址已经几乎耗尽。 IPv6地址空间庞大:IPv6使用128位地址,可以提供大约3.410^3…

爬虫自己做的

1.urllib 1.1基本使用 1.2 下载(图片,页面,视频) 1.3 get 1.3.1 quote 中文变成对应uncode编码 当url 的wd中文时 quote是将中文变成对应uncode编码 然后拼接成完整的url 1.3.2urlencode方法 wd有多个参数 1.3.3ajas get实例 …

【Git远程操作】理解分布式管理 | 创建远程仓库

目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。(add /commit /版本撤销回退/分支管理) Git是一个分布式 的版本控制系统。 分支…