GORM(Go语言数据交互库)
GORM(Go ORM,即对象关系映射)是Go语言中非常流行且功能强大的数据库交互库。它简化了与关系型数据库的交互过程,提供了丰富的API来处理各种数据库操作。下面将详细介绍GORM的功能、使用方法和一些高级特性。
1. 安装
首先,确保安装了GORM以及相应的数据库驱动:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql # MySQL驱动示例
2. 连接数据库
连接到数据库时,您需要提供数据源名称(DSN),这通常包括用户名、密码、主机地址、端口和数据库名等信息。对于MySQL,可以这样做:
import ("gorm.io/driver/mysql""gorm.io/gorm"
)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 {panic("failed to connect database")}
}
3. 定义模型
GORM使用结构体表示数据库表中的记录。定义一个User模型如下:
type User struct {ID uint `gorm:"primaryKey"`Name stringEmail string `gorm:"unique"` // 添加唯一性约束Age intBirthday time.TimeRoleID uintRole Role `gorm:"foreignKey:RoleID"` // 关联字段
}type Role struct {ID uintName string
}
4. CRUD 操作
创建:插入新记录
user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
db.Create(&user)
读取:获取记录
var user User
db.First(&user, 1) // 根据主键查找第一条记录
db.Where("name = ?", "Alice").First(&user) // 查找名字为"Alice"的用户
更新:修改记录
db.Model(&user).Update("Age", 26)
删除:移除记录
db.Delete(&user, 1) // 删除ID为1的用户
5. 关联
GORM支持多种类型的关联,如Has One、Belongs To、Has Many、Many To Many等。例如:
// Has One 关联
type CreditCard struct {ID uintNumber stringUserID uintUser User `gorm:"foreignKey:UserID"` // 外键
}// Belongs To 关联
type Pet struct {ID uintName stringUserID uintUser User `gorm:"foreignKey:UserID"` // 外键
}// Has Many 关联
type User struct {ID uintPets []Pet `gorm:"foreignKey:UserID"` // 用户拥有多只宠物
}// Many To Many 关联
type Language struct {ID uintName stringUsers []User `gorm:"many2many:user_languages;"` // 用户和语言之间的多对多关联
}
6. 自动迁移
GORM提供了一个自动迁移的功能,可以根据您的模型结构自动创建或更新表结构。
db.AutoMigrate(&User{}, &CreditCard{}, &Pet{}, &Language{})
7. 高级特性
回调函数
GORM允许自定义回调函数,在特定事件发生时执行,比如在创建、更新、删除之前或之后。
db.Callback().Create().Before("gorm:create").Register("log_before_create", func(db *gorm.DB) {fmt.Println("before create...")
})
插件
GORM可以通过插件扩展其功能。例如,添加软删除插件:
db, _ = gorm.Open(mysql.Open(dsn), &gorm.Config{Plugins: []plugin.Plugin{&plugins.SoftDelete{},},
})
原生SQL查询
GORM也支持原生SQL查询,当ORM不足以表达复杂的查询时,可以使用原始SQL。
var result []User
db.Raw("SELECT * FROM users WHERE name = ?", "Alice").Scan(&result)
事务
GORM提供了简单易用的事务管理接口。
db.Transaction(func(tx *gorm.DB) error {if err := tx.Create(&User{Name: "Bob"}).Error; err != nil {return err}if err := tx.Create(&CreditCard{Number: "1234567890123456", UserID: 1}).Error; err != nil {return err}// 返回nil代表提交事务,其他任何值都会回滚事务。return nil
})
以上是对GORM的较为全面的介绍。当然,这只是冰山一角,GORM还有更多功能和特性等待探索。官方文档是一个非常好的资源,建议深入阅读以充分利用这个工具。
相关文章:
GORM(Go语言数据交互库)
GORM(Go ORM,即对象关系映射)是Go语言中非常流行且功能强大的数据库交互库。它简化了与关系型数据库的交互过程,提供了丰富的API来处理各种数据库操作。下面将详细介绍GORM的功能、使用方法和一些高级特性。 1. 安装 首先&#…...
Redis主从同步是怎么实现的?
Redis主从同步是怎么实现的? 主从节点建立连接后,从节点会进行判断: 1.如果这是从节点之前没有同步过数据 属于初次复制,会进行全量重同步,那么从节点会向主节点发送PSYNC?-1 命令,请求主节点进行全量重…...
Flutter中Get.snackbar避免重复显示的实现
在pubspec.yaml中引入依赖框架。 #GetX依赖注解get: ^4.6.5创建一个SnackBarManager管理类去管理每个提示框。 import package:get/get.dart; import package:flutter/material.dart;class SnackBarManager {factory SnackBarManager() > instance;static final SnackBarMa…...
[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget
目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo:编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo:编辑学生信息 4.TreeWidget控件 核心方法 核心信号…...
深入Android架构(从线程到AIDL)_32 JNI架构原理_Java与C的对接05
1、EIT造形观点 基于熟悉的EIT造形,很容易理解重要的架构设计决策议题。 前言 2、混合式EIT造形 一般EIT造形是同语言的。也就是<E>、 <I>和<T>都使用同一种语言撰写的,例如上述的Java、 C/C等。于此,将介绍一个EIT造…...
【gRPC】clientPool 客户端连接池简单实现与go案例
什么是 gRPC 客户端连接池? 在 gRPC 中,创建和维护一个到服务器的连接是非常消耗资源的(比如 TCP 连接建立和 TLS 握手)。 而在高并发场景下,如果每次请求都创建新的连接,不仅会导致性能下降,还…...
Android 15应用适配指南:所有应用的行为变更
Android系统版本适配,一直是影响App上架Google Play非常重要的因素。 当前Google Play政策规定 新应用和应用更新 必须以 Android 14(API 级别 34)为目标平台,才能提交到Google Play。现有应用 必须以 Android 13(AP…...
24-25-1-单片机开卷部分习题和评分标准
依据相关规定试卷必须按评分标准进行批改。 给分一定是宽松的,能给分一定给,如有疑问也可以向学院教务办申请查卷。 一部分学生期末成绩由于紧张或其他原因导致分数过低,也是非常非常遗憾的。 个人也是非常抱歉的。 开卷考试 简答题 第一…...
STM32第6章、WWDG
一、简介 WWDG:全称Window watchdog,即窗口看门狗,本质上是一个能产生系统复位信号和提前唤醒中断的计数器。 特性: 是一个递减计数器。 看门狗被激活后, 当递减计数器值从 0x40减到0x3F时会产生复位(即T6位…...
汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮
故障现象 一辆2007款法拉利599 GTB车,搭载6.0 L V12自然吸气发动机(图1),累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车,发动机怠速轻微抖动,…...
C语言-数据结构-队列
目录 1.队列的特点 2.队列的实现 2.1.初始化队列 2.2.入队列 2.2.1.入空队列 2.2.2.入非空队列 2.3.出队列 2.4.销毁队列 2.5.完整代码 3.实际应用 1.队列的特点 队列是一种常见的数据结构,它遵循先进先出(FIFO, First In First Out)…...
STL之VectorMapList针对erase方法踩坑笔记
前沿 如下总结的三种容器,开头都会涉及当前容器的特点,再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器,存储内存是连续,且特点支持快速访问,但是插入和删除效率比较地(需要找查找和移动)。另…...
梯度下降法为什么要提前停止
什么是提前停止(Early Stopping)? 提前停止是一种正则化技术,用于在训练机器学习模型(特别是神经网络)时防止过拟合。它的核心思想是通过监控模型在验证集上的性能,在性能开始恶化之前停止训练…...
【vue3项目使用 animate动画效果】
vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示:干货篇,不废话,点赞收藏,用到会后好找藕~ 点击这里,直接看官网哦 👉 官网地址&#…...
1.1.1 C语言常用的一些函数(持续更新)
总框架见(0. 总框架-CSDN博客) (1)socket (a)分配fd;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…...
李宏毅机器学习课程笔记03 | 类神经网络优化技巧
文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training:Batch and MomentumSmall Batch vs Large Batch回顾:optimization优化 找到参数使L最小问题:为什么要用Batchÿ…...
简洁明快git入门及github实践教程
简洁明快git入门及github快速入门实践教程 前言git知识概要:一:什么是 Git?二:安装 Git三:配置 Git配置git的用户名和邮箱地址创建仓库 四:Git实践五:远程仓库操作(基于git命令使用G…...
Python使用socket实现简易的http服务
在接触的一些项目中,有时为了方便可视化一些服务状态(请求数很少),那么很容易想到使用http服务来实现。但开源的web后端框架,例如flask,fastapi,django等略显沉重,且使用这些框架会有…...
【Hive】海量数据存储利器之Hive库原理初探
文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…...
linux系统监视(centos 7)
一.系统监视 1.安装iostat,sar,sysstat(默认没有,安装过可以跳跃) iostat 和 sar: 同样,iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装:sudo yum install sysstat解释…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
