golang常用库之-操作数据库ORM:GORM 包介绍 | 一些 GORM 提示和注意事项

文章目录

  • golang操作数据库ORM:GORM 包介绍及实战
    • 一、什么是GORM 包
    • 二、GORM基本使用
      • 官方快速开始demo
    • 一些 GORM 提示和注意事项
  • 参考

golang操作数据库ORM:GORM 包介绍及实战

一、什么是GORM 包

官网:https://gorm.io/
github:https://github.com/go-gorm/gorm
官方文档:https://gorm.io/zh_CN/docs/index.html

GORM 是 Go 语言的 ORM 包,功能强大,调用方便。像腾讯、华为、阿里这样的大厂,都在使用 GORM 来构建企业级的应用。

  • 全功能 ORM
  • 关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 Preload、Joins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To to Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • 自动迁移
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

二、GORM基本使用

官方快速开始demo

官方文档:https://gorm.io/docs/

package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite"
)type Product struct {gorm.ModelCode  stringPrice uint
}func main() {db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})if err != nil {panic("failed to connect database")}// Migrate the schemadb.AutoMigrate(&Product{})// Createdb.Create(&Product{Code: "D42", Price: 100})// Readvar product Productdb.First(&product, 1) // find product with integer primary keydb.First(&product, "code = ?", "D42") // find product with code D42// Update - update product's price to 200db.Model(&product).Update("Price", 200)// Update - update multiple fieldsdb.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fieldsdb.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})// Delete - delete productdb.Delete(&product, 1)
}

db.AutoMigrate 意思 表不存在,会帮你创建表~
在 GORM 中,db.AutoMigrate(&Product{}) 函数只会在表不存在时执行数据库的自动迁移操作。如果指定的表已经存在于数据库中,并且与模型定义匹配,AutoMigrate 函数将不会对表结构进行任何更改。

  • 连接和关闭数据库。连接数据库时,可能需要设置一些参数,比如最大连接数、最大空闲连接数、最大连接时长等。
  • 插入表记录。可以插入一条记录,也可以批量插入记录。
  • 更新表记录。可以更新某一个字段,也可以更新多个字段。
  • 查看表记录。可以查看某一条记录,也可以查看符合条件的记录列表。
  • 删除表记录。可以删除某一个记录,也可以批量删除。删除还支持永久删除和软删除。

使用思路:
0) 创建一个GORM数据库连接
GORM中,你可以使用gorm.Open()方法来打开数据库连接。根据你的数据库类型和连接配置,选择合适的数据库驱动。

db, err := gorm.Open("sqlite3", dbPath)
if err != nil {ylog.Errorf("uploadFile", "open db failed, err:%v", err)return
}
defer db.Close()

1) 定义与数据库表对应的模型结构体
首先定义了一个 GORM 模型(Models),Models 是标准的 Go struct,用来代表数据库中的一个表结构。我们可以给 Models 添加 TableName 方法,来告诉 GORM 该 Models 映射到数据库中的哪张表。
Models 定义如下:

type Product struct {gorm.ModelCode  string `gorm:"column:code"`Price uint   `gorm:"column:price"`
}// TableName maps to mysql table name.
func (p *Product) TableName() string {return "product"
}

如果没有指定表名,则 GORM 使用结构体名的蛇形复数作为表名。例如:结构体名为 DockerInstance ,则表名为 dockerInstances 。

  1. 解析命令行参数,建立数据库链接
    在之后的代码中,使用 Pflag 来解析命令行的参数,通过命令行参数指定数据库的地址、用户名、密码和数据库名。之后,使用这些参数生成建立 MySQL 连接需要的配置文件,并调用 gorm.Open 建立数据库连接:

完整测试验证代码:

package mainimport ("fmt""log""github.com/spf13/pflag""gorm.io/driver/mysql""gorm.io/gorm"
)type Product struct {gorm.ModelCode  string `gorm:"column:code"`Price uint   `gorm:"column:price"`
}// TableName maps to mysql table name.
func (p *Product) TableName() string {return "product"
}var (host     = pflag.StringP("host", "H", "127.0.0.1:3306", "MySQL service host address")username = pflag.StringP("username", "u", "root", "Username for access to mysql service")password = pflag.StringP("password", "p", "root", "Password for access to mysql, should be used pair with password")database = pflag.StringP("database", "d", "test", "Database name to use")help     = pflag.BoolP("help", "h", false, "Print this help message")
)func main() {// Parse command line flagspflag.CommandLine.SortFlags = falsepflag.Usage = func() {pflag.PrintDefaults()}pflag.Parse()if *help {pflag.Usage()return}dns := fmt.Sprintf(`%s:%s@tcp(%s)/%s?charset=utf8&parseTime=%t&loc=%s`,*username,*password,*host,*database,true,"Local")db, err := gorm.Open(mysql.Open(dns), &gorm.Config{})if err != nil {panic("failed to connect database")}// 不建议在正式的代码中自动迁移表结构,生产环境注意注掉本行// 1. Auto migration for given modelsdb.AutoMigrate(&Product{})// 2. Insert the value into databaseif err := db.Create(&Product{Code: "D42", Price: 100}).Error; err != nil {log.Fatalf("Create error: %v", err)}PrintProducts(db)// 3. Find first record that match given conditionsproduct := &Product{}if err := db.Where("code= ?", "D42").First(&product).Error; err != nil {log.Fatalf("Get product error: %v", err)}// 4. Update value in database, if the value doesn't have primary key, will insert itproduct.Price = 200if err := db.Save(product).Error; err != nil {log.Fatalf("Update product error: %v", err)}PrintProducts(db)// 5. Delete value match given conditionsif err := db.Where("code = ?", "D42").Delete(&Product{}).Error; err != nil {log.Fatalf("Delete product error: %v", err)}PrintProducts(db)
}// List products
func PrintProducts(db *gorm.DB) {products := make([]*Product, 0)var count int64d := db.Where("code like ?", "%D%").Offset(0).Limit(2).Order("id desc").Find(&products).Offset(-1).Limit(-1).Count(&count)if d.Error != nil {log.Fatalf("List products error: %v", d.Error)}log.Printf("totalcount: %d", count)for _, product := range products {log.Printf("\tcode: %s, price: %d\n", product.Code, product.Price)}
}

一些 GORM 提示和注意事项

一些 GORM 提示和注意事项
参考URL: https://dev.to/daniel1in/some-gorm-tips-and-notes-3lm2

参考

官方文档:https://gorm.io/zh_CN/docs/index.html
30 | ORM:CURD 神器 GORM 包介绍及实战
https://time.geekbang.org/column/article/403351

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

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

相关文章

【PyQt】09-控件提示信息、Lable标签

文章目录 前言一、控件提示信息1.1 代码1.2 解释 < b >在HTML标签中的作用1.3 添加按键后的代码运行结果 二、QLabel控件介绍2.1 内容2.2 常用的事件2.3 代码结果展示 总结 前言 1、控件提示信息 2、QLabel控件介绍 一、控件提示信息 关键点在于 效果如图所示&#x…

VR和AR傻傻分不清,一句话给你讲明白。

不说废话&#xff0c;直接说结论&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;和增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;。如果现实是A&#xff0c;虚拟是B&#xff0c;那么VRB&#xff0c;ARAB&#xff0c;就这简单&…

大模型实战营第二期——3. 基于 InternLM 和 LangChain 搭建你的知识库

github地址&#xff1a;InternLM/tutorial-书生浦语大模型实战营文档地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库视频地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库Intern Studio: https://studio.intern-ai.org.cn/console/instance动手学大模型…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表&#xff1a; 首先要明白是如何用数组实现&#xff0c; 在这里需要用到几个数组&#xff0c;head表示头节点的下标&#xff0c;e[i]表示表示下标为i的值&#xff0c;ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

HTTP 协议在互联网中的作用是什么?

首先&#xff0c;HTTP 协议是互联网上应用最为广泛的一种网络协议。它被设计为无状态的&#xff0c;意味着服务器不会为每个请求保持状态。HTTP 协议的请求方法有 GET、POST、PUT、DELETE 等&#xff0c;分别对应着不同的操作。例如&#xff0c;GET 方法用于请求数据&#xff0…

Git的基础操作指令

目录 1 前言 2 指令 2.1 git init 2.2 touch xxx 2.3 git status 2.4 git add xxx 2.5 git commit -m xxxx 2.5 git log及git log --prettyoneline --all --graph --abbrev-commit 2.6 rm xxx 2.7 git reset --hard xxx(含小技巧) 2.8 git reflog 2.9 mv xxx yyy 1…

【BIAI】Lecture 14 - Sleep and Dreaming

Sleep and Dreaming 专业词汇 pons 延髓 parietal cortex 顶叶皮层 limbic system 边缘系统 temporal cortex 颞叶皮层 dorsolateral prefrontal cortex 背外侧前额叶皮层 pineal gland 松果体 Suprachiasmatic Nucleus 视交叉上核 课程大纲 Sleep stages awake无眼动睡眠&am…

【Python如何求出所有3位数的回文数】

回文数就是正向读和逆向读都相同的数&#xff0c;如66&#xff0c;626&#xff0c;72127 1、求出所有3位数的回文数python代码如下&#xff1a; # 输出所有3位数的回文数 for i in range(100, 1000): # 从100循环到999&#xff0c;不包含1000if str(i) str(i)[::-1]: # 如…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果&#xff0c;视频制作者可能会采用动态水印的方式&#xff0c;让其他人难以盗取视频使用。动态水印的添加&#xff0c;需要应用到运动路径功能。接下来&#xff0c;本文会教大家动态水印怎么加&#xff0c;怎么去除动态水印的相关内容。感兴趣的小…

【知识整理】接手新技术团队、管理团队

引言 针对目前公司三大技术中心的不断升级&#xff0c;技术管理岗位要求越来越高&#xff0c;且团队人员特别是管理岗位的选择任命更是重中之重&#xff0c;下面针对接手新的技术团队做简要整理&#xff1b; 一、实践操作 1、前期准备 1、熟悉情况&#xff1a; 熟悉人员&am…

XSS-Lab

1.关于20关的payload合集。 <script>alert(1)</script> "><script>alert(1)</script> onclickalert(1) " onclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

【机器学习笔记】基于实例的学习

基于实例的学习 文章目录 基于实例的学习1 基本概念与最近邻方法2 K-近邻&#xff08;KNN&#xff09;3 距离加权 KNN4 基于实例/记忆的学习器5 局部加权回归5 多种回归方式对比6 懒惰学习与贪婪学习 ​ 动机&#xff1a;人们通过 记忆和行动来推理学习。 1 基本概念与最近邻方…

四轴飞行器pid简介

四轴飞行器通过螺旋桨的转动产生升力&#xff0c;克服重力飞行&#xff0c; 四电机如果同一方向&#xff0c;除升力外&#xff0c;还会有个旋转分量&#xff0c;所以一般两个相临电机反方向旋转&#xff0c;抵消掉旋转分量&#xff0c;实现飞行器的平稳飞行。现实情况电机螺旋浆…

C#入门及进阶|数组和集合(六):集合概述

1.集合概述 数组是一组具有相同名称和类型的变量集合&#xff0c;但是数组初始化后就不便于再改变其大小&#xff0c;不能实现在程序中动态添加和删除数组元素&#xff0c;使数组的使用具有很多局限性。集合能解决数组存在的这个问题&#xff0c;下面我们来学习介绍集合…

Web课程学习笔记--jsonp的原理与简单实现

jsonp的原理与简单实现 原理 由于同源策略的限制&#xff0c;XmlHttpRequest只允许请求当前源&#xff08;域名、协议、端口&#xff09;的资源&#xff0c;为了实现跨域请求&#xff0c;可以通过script标签实现跨域请求&#xff0c;然后在服务端输出JSON数据并执行回调函数&…

AES加密中的CBC和ECB

目录 1.说明 2.ECB模式&#xff08;base64&#xff09; 3.CBC模式 4.总结 1.说明 AES是常见的对称加密算法&#xff0c;加密和解密使用相同的密钥&#xff0c;流程如下&#xff1a; 主要概念如下&#xff1a; ①明文 ②密钥 用来加密明文的密码&#xff0c;在对称加密算…

算法学习——LeetCode力扣二叉树篇2

算法学习——LeetCode力扣二叉树篇2 107. 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#…

OSDI 2023: Conveyor One-Tool-Fits-All Continuous Software Deployment at Meta

我们使用以下6个分类标准对本文的研究选题进行分析: 1. 部署策略: 蓝/绿部署: 这种策略涉及运行两个相同的环境:“蓝”(当前版本)和“绿”(新版本)。流量被引导到绿色环境进行测试,如果成功,则会无缝切换,最大限度地减少停机时间。金丝雀发布: 这是一个渐进的发布过程,新…

用C语言列出Linux或Unix上的网络适配器

上代码&#xff1a; 1. #include <sys/socket.h> 2. #include <stdio.h> 3. 4. #include <netdb.h> 5. #include <ifaddrs.h> 6. 7. int main() { 8. struct ifaddrs *addresses; 9. if(getifaddrs(&addresses) -1) { 10. printf("…

贰[2],Xamarin生成APK

1&#xff0c;生成改为Release版本 2&#xff0c;选中****.Android项目 3&#xff0c;点击生成&#xff0c;选择存档 4&#xff0c;点击分发 5&#xff0c;选择临时 6&#xff0c;添加签名标识 7&#xff0c;选择对应的签名标识&#xff0c;点击另存为