一个高度可扩展的 Golang ORM 库【GORM】

        GORM 是一个功能强大的 Golang 对象关系映射(ORM)库,它提供了简洁的接口和全面的功能,帮助开发者更方便地操作数据库。

1. 完整的 ORM 功能

• 支持常见的关系模型:

• Has One(一对一)

• Has Many(一对多)

• Belongs To(从属)

• Many To Many(多对多)

• 多态关联(Polymorphism)

• 单表继承(Single Table Inheritance)

2. 钩子函数(Hooks)

• 支持模型的生命周期钩子,例如:

• BeforeCreate / AfterCreate

• BeforeSave / AfterSave

• BeforeUpdate / AfterUpdate

• BeforeDelete / AfterDelete

• BeforeFind / AfterFind

3. 数据查询与加载

• 预加载(Preload):一次性加载关联数据。

• 联表查询(Joins):通过 SQL JOIN 查询关联表。

4. 事务支持

• 支持事务管理,包括:

• 开启事务

• 嵌套事务

• 保存点(Save Point)

• 回滚到特定保存点

5. 复杂功能支持

SQL 构建器:支持动态生成复杂的 SQL 查询。

乐观锁与悲观锁:通过 Select For Update 等机制实现。

复合主键:支持定义多个字段作为主键。

索引与约束:可为模型字段添加索引和约束规则。

6. 自动迁移

• 根据模型结构自动创建或更新数据库表。

demo例子

模型定义

type User struct {ID        uint      `gorm:"primaryKey"`Name      stringEmail     string    `gorm:"unique"`Age       intCreatedAt time.Time
}

基本操作

// 创建记录
db.Create(&User{Name: "Alice", Email: "alice@example.com", Age: 25})// 查询记录
var user User
db.First(&user, 1) // 查询主键为 1 的记录
db.Where("name = ?", "Alice").First(&user)// 更新记录
db.Model(&user).Update("Age", 26)// 删除记录
db.Delete(&user)

完整代码:

package mainimport ("fmt""log""net/http""time""github.com/gin-gonic/gin""gorm.io/driver/sqlite""gorm.io/gorm"
)// User 模型
type User struct {ID        uint      `gorm:"primaryKey"`Name      string    `json:"name"`Email     string    `json:"email" gorm:"unique"`Age       int       `json:"age"`CreatedAt time.Time `json:"created_at"`
}// 初始化数据库
func initDB() *gorm.DB {// 使用 SQLite 数据库(也可以替换为 MySQL、PostgreSQL 等)db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})if err != nil {log.Fatal("Failed to connect to database:", err)}// 自动迁移表结构if err := db.AutoMigrate(&User{}); err != nil {log.Fatal("Failed to migrate database:", err)}return db
}func main() {// 初始化数据库db := initDB()// 初始化 Gin 路由r := gin.Default()// 创建用户r.POST("/users", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}if result := db.Create(&user); result.Error != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()})return}c.JSON(http.StatusCreated, user)})// 获取所有用户r.GET("/users", func(c *gin.Context) {var users []Userif result := db.Find(&users); result.Error != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()})return}c.JSON(http.StatusOK, users)})// 根据 ID 获取用户r.GET("/users/:id", func(c *gin.Context) {id := c.Param("id")var user Userif result := db.First(&user, id); result.Error != nil {c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})return}c.JSON(http.StatusOK, user)})// 更新用户r.PUT("/users/:id", func(c *gin.Context) {id := c.Param("id")var user Userif result := db.First(&user, id); result.Error != nil {c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})return}var input Userif err := c.ShouldBindJSON(&input); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 更新字段user.Name = input.Nameuser.Email = input.Emailuser.Age = input.Agedb.Save(&user)c.JSON(http.StatusOK, user)})// 删除用户r.DELETE("/users/:id", func(c *gin.Context) {id := c.Param("id")if result := db.Delete(&User{}, id); result.Error != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()})return}c.JSON(http.StatusOK, gin.H{"message": "User deleted successfully"})})// 启动服务if err := r.Run(":8080"); err != nil {log.Fatal("Failed to start server:", err)}
}

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

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

相关文章

【大数据学习 | Spark-Core】Spark的改变分区的算子

当分区由多变少时,不需要shuffle,也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时,是需要shuffle的。 但极端情况下(1000个分区变成1个分区),这时如果将shuffle设置为false,父子RDD是窄依赖关系&…

IDEA2024如何创建Web项目以及配置Tomcat

在Web项目的开发过程中,Tomcat作为一款开源的Servlet容器,扮演着至关重要的角色。它不仅能够提供稳定的运行环境,还支持多种Java EE规范,为开发者提供了丰富的功能支持。因此,正确配置Tomcat服务器对于确保Web项目的顺…

【通俗理解】隐变量的变分分布探索——从公式到应用

【通俗理解】隐变量的变分分布探索——从公式到应用 关键词提炼 #隐变量 #变分分布 #概率模型 #公式推导 #期望最大化 #机器学习 #变分贝叶斯 #隐马尔可夫模型 第一节:隐变量的变分分布的类比与核心概念【尽可能通俗】 隐变量的变分分布就像是一场“捉迷藏”游戏…

亚信安全与飞书达成深度合作

近日,亚信安全联合飞书举办的“走近先进”系列活动正式走进亚信。活动以“安全护航信息化 共筑数字未来路”为主题,吸引了众多数字化转型前沿企业的近百位领导参会。作为“走近先进”系列的第二场活动,本场活动更加深入挖掘了数字化转型的基础…

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了,而且Vue项目就应该正经走项目流程啊喂! npm i amap/amap-jsapi-loader --save 官方说这样执行完,就这结束啦!它结束了,我还没有,不然不可能记录这篇文…

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…

Ansible--自动化运维工具

Ansible自动化运维工具介绍 1.Ansible介绍 Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。…

WSL安装不同版本ubuntu(已有ubuntu20.04,再装ubuntu18.04)

参考: 如何在 WSL 中删除指定版本的 Ubuntu(以删除 Ubuntu 22.04 为例)_wsl卸载某个-CSDN博客 已有ubuntu20.04,现在再安装一个ubuntu18.04 直接参考下面我写的链接的第四步,前面的步骤都不需要再做了 Win11安装WSL…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1(Generative Pre-trained Transformer)是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构,具有如下创新点: NLP领域的迁移学习:通过最…

websocket是什么?

一、定义 Websocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端不断的轮询服务器来获取数据 与http协议不同,http是一种无状态的,请求,响应模式的协议(单向通信)&a…

1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试 package mainimport ("fmt""golang.org/x/crypto/bcrypt" )func main() {password : []byte("mysecretpassword")hashedPassword, err : bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err ! nil {fmt.Println(err)…

CSS —— 子绝父相

相对定位:占位;不脱标 绝对定位:不占位;脱标 希望子元素相对于父元素定位,又不希望父元素脱标(父元素占位) 子级是 绝对定位,不会占有位置, 可以放到父盒子里面的任何一…

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计 简介 在前端开发的世界里,HTML5和CSS3是构建现代网页的基石。本文将通过一个简单的HTML5页面模板,展示如何使用HTML5的结构化元素和CSS3的样式特性,来创建一个…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示&#xff…

ctfshow单身杯2024wp

文章目录 ctfshow单身杯2024wp签到好玩的PHPezzz_sstiez_inject ctfshow单身杯2024wp 签到好玩的PHP 考点&#xff1a;序列化反序列化 <?phperror_reporting(0);highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public …

ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案

在金融行业&#xff0c;银行营业厅的安全保卫工作至关重要&#xff0c;它不仅关系到客户资金的安全&#xff0c;也关系到整个银行的信誉和运营效率。随着科技的发展&#xff0c;传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…

【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法

课程链接 线性回归的从零开始实现 import random import torch from d2l import torch as d2l# 人造数据集 def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.01,y.shape) # 加入噪声return X,y.reshape…

zotero安卓测试版下载和使用

2023年年底&#xff0c;Zotero官方就已经推出了安卓版的测试版Zotero for Android (beta),&#xff0c;但名额有限且只能通过Google商店下载。此外&#xff0c;还有一些第三方开发的安卓应用&#xff0c;如Zoo for Zotero、ZotDroid等。 在首次使用Zotero安卓版时&#xff0c;用…

基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功

基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器&#xff0c;2FSK 的两个频率为:fI15KHz&#xff0c;f23KHz&#xff0c;波特率为 1500 bps,比特0映射为f 载波&#xff0c;比特1映射为 载波。 1&#xff09…

Matlab 深度学习 PINN测试与学习

PINN 与传统神经网络的区别 与传统神经网络的不同之处在于&#xff0c;PINN 能够以微分方程形式纳入有关问题的先验专业知识。这些附加信息使 PINN 能够在给定的测量数据之外作出更准确的预测。此外&#xff0c;额外的物理知识还能在存在含噪测量数据的情况下对预测解进行正则…