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

devtools/2024/11/27 6:56:17/

        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.ppmy.cn/devtools/137330.html

相关文章

Spring Boot 整合 ELK 全面指南:实现日志采集、分析与可视化

一、ELK简介 1.1 什么是ELK? ELK 是三个开源工具的组合: Elasticsearch:一个分布式全文搜索和分析引擎,用于存储和查询日志数据。Logstash:一个数据处理管道工具,用于收集、解析和处理日志数据。Kibana&…

深入了解决策树---机器学习中的经典算法

引言 决策树(Decision Tree)是一种重要的机器学习模型,以直观的分层决策方式和简单高效的特点成为分类和回归任务中广泛应用的工具。作为解释性和透明性强的算法,决策树不仅适用于小规模数据,也可作为复杂模型的基石&…

养宠宠物空气净化器哪个好?实测热销品牌安德迈、希喂、小米

最近啊,猫咪们开始换毛了,不少铲屎官们正打算买个养宠宠物空气净化器呢,但面对众多选择,是不是有点儿犯愁不知道该咋挑?别担心,作为养猫多年的老手,我今天就来实测三款特别火的养宠宠物空气净化…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表,对照bom表买 1、买电容时有50V或者100V是它的耐压值,注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出,有那种可调降压比如如下,别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

Perforce Automation With Python

11/2024 出版 MP4 |视频:h264, 19201080 |音频:AAC,44.1 KHz 语言:英语 |大小: 2.65 GB |时长: 5 小时 18 分钟 使用 Python 脚本简化与 Perforce 版本控制系统相关的生产流程 您将学 到什么 …

001 MATLAB介绍

前言: 软件获取渠道有很多,难点也就是百度网盘下载慢; 线上版本每月有时间限制。 01 MATLAB介绍 性质: MATLAB即Matrix Laboratory 矩阵实验室的意思,是功能强大的计算机高级语言, 已广泛应用于各学科研究部门、…

力扣 53. 最大子数组和

🔗 https://leetcode.cn/problems/maximum-subarray 题目 给定一个数组,有正数,有复数,返回子序列之和的最大值 思路 这个题目《编程珠玑》讲过,思路从普速的模拟,到 presum 优化,到代码很容…

uniapp-vue2引用了vue-inset-loader插件编译小程序报错

报错信息 Error: Vue packages version mismatch: - vue3.2.45 (D:\qjy-myApp\admin-app\node_modules\vue\index.js) - vue-template-compiler2.7.16 (D:\qjy-myApp\admin-app\node_modules\vue-template-compiler\package.json) This may cause things to work incorrectly.…