当前位置: 首页 > news >正文

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 OneBelongs ToHas ManyMany 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造形&#xff0c;很容易理解重要的架构设计决策议题。 前言 2、混合式EIT造形 一般EIT造形是同语言的。也就是<E>、 <I>和<T>都使用同一种语言撰写的&#xff0c;例如上述的Java、 C/C等。于此&#xff0c;将介绍一个EIT造…...

【gRPC】clientPool 客户端连接池简单实现与go案例

什么是 gRPC 客户端连接池&#xff1f; 在 gRPC 中&#xff0c;创建和维护一个到服务器的连接是非常消耗资源的&#xff08;比如 TCP 连接建立和 TLS 握手&#xff09;。 而在高并发场景下&#xff0c;如果每次请求都创建新的连接&#xff0c;不仅会导致性能下降&#xff0c;还…...

Android 15应用适配指南:所有应用的行为变更

Android系统版本适配&#xff0c;一直是影响App上架Google Play非常重要的因素。 当前Google Play政策规定 新应用和应用更新 必须以 Android 14&#xff08;API 级别 34&#xff09;为目标平台&#xff0c;才能提交到Google Play。现有应用 必须以 Android 13&#xff08;AP…...

24-25-1-单片机开卷部分习题和评分标准

依据相关规定试卷必须按评分标准进行批改。 给分一定是宽松的&#xff0c;能给分一定给&#xff0c;如有疑问也可以向学院教务办申请查卷。 一部分学生期末成绩由于紧张或其他原因导致分数过低&#xff0c;也是非常非常遗憾的。 个人也是非常抱歉的。 开卷考试 简答题 第一…...

STM32第6章、WWDG

一、简介 WWDG&#xff1a;全称Window watchdog&#xff0c;即窗口看门狗&#xff0c;本质上是一个能产生系统复位信号和提前唤醒中断的计数器。 特性&#xff1a; 是一个递减计数器。 看门狗被激活后&#xff0c; 当递减计数器值从 0x40减到0x3F时会产生复位&#xff08;即T6位…...

汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮

故障现象  一辆2007款法拉利599 GTB车&#xff0c;搭载6.0 L V12自然吸气发动机&#xff08;图1&#xff09;&#xff0c;累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车&#xff0c;发动机怠速轻微抖动&#xff0c;…...

C语言-数据结构-队列

目录 1.队列的特点 2.队列的实现 2.1.初始化队列 2.2.入队列 2.2.1.入空队列 2.2.2.入非空队列 2.3.出队列 2.4.销毁队列 2.5.完整代码 3.实际应用 1.队列的特点 队列是一种常见的数据结构&#xff0c;它遵循先进先出&#xff08;FIFO, First In First Out&#xff09…...

STL之VectorMapList针对erase方法踩坑笔记

前沿 如下总结的三种容器&#xff0c;开头都会涉及当前容器的特点&#xff0c;再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器&#xff0c;存储内存是连续&#xff0c;且特点支持快速访问&#xff0c;但是插入和删除效率比较地(需要找查找和移动)。另…...

梯度下降法为什么要提前停止

什么是提前停止&#xff08;Early Stopping&#xff09;&#xff1f; 提前停止是一种正则化技术&#xff0c;用于在训练机器学习模型&#xff08;特别是神经网络&#xff09;时防止过拟合。它的核心思想是通过监控模型在验证集上的性能&#xff0c;在性能开始恶化之前停止训练…...

【vue3项目使用 animate动画效果】

vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示&#xff1a;干货篇&#xff0c;不废话&#xff0c;点赞收藏&#xff0c;用到会后好找藕~ 点击这里&#xff0c;直接看官网哦 &#x1f449; 官网地址&#…...

1.1.1 C语言常用的一些函数(持续更新)

总框架见&#xff08;0. 总框架-CSDN博客&#xff09; &#xff08;1&#xff09;socket (a)分配fd&#xff1b;(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&#xff1a;Batch and MomentumSmall Batch vs Large Batch回顾&#xff1a;optimization优化 找到参数使L最小问题&#xff1a;为什么要用Batch&#xff…...

简洁明快git入门及github实践教程

简洁明快git入门及github快速入门实践教程 前言git知识概要&#xff1a;一&#xff1a;什么是 Git&#xff1f;二&#xff1a;安装 Git三&#xff1a;配置 Git配置git的用户名和邮箱地址创建仓库 四&#xff1a;Git实践五&#xff1a;远程仓库操作&#xff08;基于git命令使用G…...

Python使用socket实现简易的http服务

在接触的一些项目中&#xff0c;有时为了方便可视化一些服务状态&#xff08;请求数很少&#xff09;&#xff0c;那么很容易想到使用http服务来实现。但开源的web后端框架&#xff0c;例如flask&#xff0c;fastapi&#xff0c;django等略显沉重&#xff0c;且使用这些框架会有…...

【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&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…...

Fay数字人框架全攻略:从技术原理到商业落地的完整实践指南

Fay数字人框架全攻略&#xff1a;从技术原理到商业落地的完整实践指南 【免费下载链接】Fay Fay 是一个开源的数字人类框架&#xff0c;集成了语言模型和数字字符。它为各种应用程序提供零售、助手和代理版本&#xff0c;如虚拟购物指南、广播公司、助理、服务员、教师以及基于…...

GLM-OCR与IDEA开发环境联动:打造智能代码注释与文档生成插件

GLM-OCR与IDEA开发环境联动&#xff1a;打造智能代码注释与文档生成插件 想象一下这个场景&#xff1a;你正在一个技术分享会上&#xff0c;看到屏幕上闪过一段精妙的代码片段&#xff0c;你赶紧用手机拍了下来。回到工位&#xff0c;你不再需要对着照片一个字一个字地敲键盘&…...

保姆级教程:手把手教你为Jetson Orin Nano刷入R36.4.4系统(从下载到开机)

从零开始&#xff1a;Jetson Orin Nano开发者套件系统刷入全流程实战指南 当你第一次拿到NVIDIA Jetson Orin Nano开发者套件时&#xff0c;那种兴奋感可能很快会被"我该如何开始"的困惑所取代。这款性能强大的边缘计算设备确实令人着迷&#xff0c;但如果没有正确的…...

UE后期处理材质实战:从黑白蒙版到卡通渲染的进阶应用

1. 黑白蒙版遮罩的底层原理与应用 在UE4后期处理材质中&#xff0c;黑白蒙版遮罩是最基础也最实用的功能之一。我第一次接触这个功能时&#xff0c;被它强大的选择性处理能力惊艳到了——它能像手术刀一样精准地分离出场景中的特定物体。 核心原理其实很简单&#xff1a;通过Sc…...

高效掌控暗影精灵设备:开源工具OmenSuperHub的四大突破

高效掌控暗影精灵设备&#xff1a;开源工具OmenSuperHub的四大突破 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 告别原厂软件臃肿困扰&#xff0c;体验纯净硬件控制新方式 OmenSuperHub是一款专为惠普暗影精灵笔记本打造…...

【实战指南】彻底解决conda环境变量配置错误:从报错分析到.bashrc修复

1. 遇到conda环境变量报错怎么办&#xff1f; 刚装完Anaconda/Miniconda&#xff0c;满心欢喜准备大展身手&#xff0c;结果终端里输入conda却蹦出一行刺眼的红色报错&#xff1a;"bash: /opt/conda/bin/conda: No such file or directory"。这种场景我见过太多次了&…...

【模型手术室】第九篇:多模态微调 —— 让模型学会“看图说话”:从像素到行业认知的飞跃

专栏进度&#xff1a;09 / 10 (微调实战专题) 如果你使用的是 LLaVA、Qwen2-VL 或 DeepSeek-VL&#xff0c;它们原生具备识别猫狗和常识图片的能力。但如果你给它一张半导体无尘车间的传感器拓扑图&#xff0c;它大概率会胡言乱语。多模态微调的目标&#xff0c;就是建立“视觉…...

基于PyTorch Geometric的交通网络流量预测与优化

基于PyTorch Geometric的交通网络流量预测与优化 【免费下载链接】pytorch_geometric Graph Neural Network Library for PyTorch 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric 问题定义&#xff1a;破解城市交通网络的复杂性挑战 交通网络的图…...

MixText+BERT还能这么玩?手把手复现FPMT论文中的‘概率伪混合’黑科技

解密FPMT论文中的概率伪混合&#xff1a;BERT隐藏层的动态插值艺术 在自然语言处理领域&#xff0c;数据增强一直是提升模型泛化能力的关键技术。传统MixText方法通过线性插值在输入层混合样本&#xff0c;但这种"一刀切"的方式忽视了不同样本对模型训练的差异化价值…...

RPCS3完全攻略:从零开始打造你的PC端PS3游戏中心

RPCS3完全攻略&#xff1a;从零开始打造你的PC端PS3游戏中心 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为无法重温经典PS3游戏而烦恼吗&#xff1f;想要在电脑上体验《最后生还者》、《神秘海域》等索…...