gorm使用&踩坑记录

简介: 最近在自己写一个go的项目,在这里记录一下~

从上周觉得在go里边手写db.exec(select * from xxx) 非常痛苦之后,开始使用gorm这个框架,感觉确实很不错,但是可能是由于自己的见识还是不够广阔,导致踩了一些小坑,还留了一些问题··这里先记录一下:

什么是gorm

gorm可以类比到java的mybatsis,非常方便的orm操作框架,可以方便的操作数据库。

怎么使用

官方教程里边讲的已经非常详细了,我大致大致写一下流程

先建立数据库对应的struct,这个可以对应到spring里边的model

type User struct {
  gorm.Model
  Name   string `gorm:"column:name; unique" db:"name" json:"name" form:"name"` 
  Desc   string `gorm:"column:desc" db:"desc" json:"desc" form:"desc"`         
}

这就是个非常普通的model,接下来我们挨个看:

  • 这个struct的名字是user, 可以用db.AutoMigrate(&User{})来检查表和struct是否匹配,如果这个表不存在,就会以struct的名字的复数形式来自动建表,比如这个结构自动建表的表名就是users,当然如果不想用这个表名的话,也可以手动指定其他的表名。
  • gorm.Model是内嵌了一个结构体,这个结构体里边包括id、创建时间、修改时间、删除时间。我们亦可以内嵌其他的结构体进来。
  • 每个属性后边的描述体gorm:"column:name; unique" db:"name" json:"name" form:"name"在gorm这个里边可以指定列名、列是否是主键、是否是索引等····这里没有指定主键是因为grom.Model里边的id为默认主键。

线程池

func getConn() (*gorm.DB, error) {
  dsn := "root:123456@tcp(localhost:3306)/fund?charset=utf8mb4&parseTime=True&loc=Local"
  db, error := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  sqlDB, _ := db.DB()
  // SetMaxIdleConns 设置空闲连接池中连接的最大数量
  sqlDB.SetMaxIdleConns(10)
  // SetMaxOpenConns 设置打开数据库连接的最大数量。
  sqlDB.SetMaxOpenConns(100)
  // SetConnMaxLifetime 设置了连接可复用的最大时间。
  sqlDB.SetConnMaxLifetime(time.Hour)
  return db, error
}

其他的函数直接调用getConn()获取db就可以了。

CRUD Methods

// 新增
user := &User{Name: name, Desc: desc}
db.Debug().Create(user)
//查询
var user_in User
db.Debug().Where(user).First(&user_in)

为啥明明是最重要的却只写了这么点?因为这块网上资料最多似乎没必要看我的···

但是这块我有个问题··先记录一下

// 以id作为冲突键,如果有冲突的话什么都不做
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&user)
// 以其他字段作为主键,如果冲突的话do nothing
db.Clauses(clause.OnConflict{
  Columns:   []clause.Column{{Name: "name"}},DoNothing: true}).Create(&user)

我想要做Upsert,用name来检查冲突,如果有冲突的话do nothing,在上边代码的第二段里边指定了name,可以看生成的sql还是用的是id···不知道有没有大佬知道要怎么搞


其他好像没啥了,想起来、遇到了再补充

相关文章
|
编解码 网络协议 Unix
SIP协议&开源SIP服务器搭建和客户端安装
1. SIP SIP 是一个应用层的控制协议,可以用来建立,修改,和终止多媒体会话,例如Internet电话 SIP在建立和维持终止多媒体会话协议上,支持五个方面: 1)   用户定位: 检查终端用户的位置,用于通讯。
18517 0
|
9月前
|
机器学习/深度学习 人工智能 机器人
黑箱与具身之间的因子框架( Prompt大模型的自我描述 系列五)
本文探讨大模型的“量子式黑箱”困境,指出其虽强大却缺乏可解释性。作者提出“因子框架”,以结构性推理替代概率坍缩,实现因果可控;并重新定义多模态,从“模态互通”走向“因子统一”。最终指向具身智能的真正起点:让AI在逻辑中融合感知,走出语言,迈向真实世界。
330 9
|
4月前
|
API 开发者
实时股票查询接口汇总-A股-沪深-报价-排行-成交
本API提供全面A股及沪深市场行情数据,涵盖K线、报价、排行、停牌、板块、分时成交等20+接口,支持多周期K线与均线计算,助力个人开发者与机构快速构建看盘工具或量化交易系统。
1072 2
|
12月前
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
311 0
|
关系型数据库 MySQL 数据库
MySQL 查询结果求和详解
MySQL 查询结果求和详解
878 0
|
监控 Java 网络性能优化
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
本文介绍了 Kubernetes 中的容器工作内存(WorkingSet)概念,它用于表示容器内存的实时使用量,尤其是活跃内存。
57812 121
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
|
缓存 应用服务中间件 Go
Go打包和部署:从编译到运行的全指南
本文介绍了Go语言项目的打包和部署方法,包括使用`go run`、`go build`和`go install`命令进行编译,以及跨平台交叉编译。文章还提到了编译参数如`-x`、`-n`和`-race`等。此外,还讨论了如何利用第三方工具(如go-bindata)打包非Go文件,以及清理编译缓存和压缩二进制文件。最后,文中展示了如何使用supervisor和Docker进行部署,并提供了Nginx的反向代理配置示例。
4517 1
|
Linux Go
手把手教你在Linux上从零搭建Go语言开发环境
手把手教你在Linux上从零搭建Go语言开发环境
1729 0
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
554 7
|
机器学习/深度学习 存储 人工智能
一文搞懂 Transformer 工作原理 !!
一文搞懂 Transformer 工作原理 !!
1142 0