gorm 遇坑总结

time 包 和 gorm 执行的问题

知识点

我们都知道,使用 golang 的 time 包可以对时间格式进行转换,比如:

  • time.xxx.Format() 可以将 time.time 格式转换为 string 格式
  • time.Parse 可以将 string 格式转换为 time.time 格式

坑点

time.Parse 默认转出来是 +0000 UTC 时间,不是中国东八区的 +0800 CST 时间,传给数据库执行的时候,会出现时间推迟 8 小时的情况,且不好排查(因为 SQL debug 打印出来的看不出异常,拿着语句直接去数据库上可以执行)。
在尝试了多种 SQL 姿势之后,还是一样的效果,最后连上 MySQL 分析实际执行的语句才发现异常。

到 MySQL 上查看执行的查询语句的方法:

pager grep [ip]     # 设置过滤出执行脚本的机器 IP
show full processlist   # 查看 MYSQL 现在正在执行的语句

解决

需要用 time.ParseInLocation 方法替换 time.Parse ,这样转换出来的时间就是 +0800 CST 时间

执行原生 SQL 问题

知识点

在执行一些复杂语句或者排查问题的时候,会直接使用 原生 SQL ,这样可能会直观一些;

坑点

原生 SQL 执行查询时,默认只能选出一行数据来,需要查询多行时,得多一步处理

https://jasperxu.github.io/gorm-zh/advanced.html#sb

### GORM 基本概念与功能 GORM 是一种用于 Go 的对象关系映射 (ORM) 工具,它提供了简单而强大的接口来操作数据库[^1]。通过 GORM,开发者可以轻松实现数据模型定义、迁移以及 CRUD 操作等功能。 #### 安装 GORM 和驱动程序 要使用 GORM,首先需要安装其依赖项和对应的数据库驱动程序。以下是针对不同数据库的安装命令: ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/mysql # 对于 MySQL 数据库 go get -u gorm.io/driver/postgres # 对于 PostgreSQL 数据库 go get -u gorm.io/driver/sqlite # 对于 SQLite 数据库 ``` #### 创建连接到数据库实例 下面是一个简单的例子,展示如何创建并初始化一个 GORM 实例并与数据库建立连接: ```go package main import ( "fmt" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { fmt.Println(err) return } fmt.Println("Connected to the database successfully!") } ``` 此代码片段展示了如何打开一个新的 SQLite 连接,并打印成功消息如果一切正常运行的话[^1]。 #### 自动迁移支持 GORM 提供了一个自动迁移的功能,允许基于结构体字段自动生成表结构变化脚本。这使得管理数据库模式变得更加容易。 ```go type User struct { ID uint Name string Age int } db.AutoMigrate(&User{}) // 将会根据 `User` 结构体创建对应的数据表 ``` 上面的例子说明了当调用 AutoMigrate 方法时,GORM 如何依据给定的结构体去更新或者新建相应的表格。 #### 执行基本查询操作 执行基础增删改查的操作也非常直观,在这里提供几个常见的示例: 增加记录: ```go user := User{Name: "John Doe", Age: 30} result := db.Create(&user) fmt.Println(result.RowsAffected) // 输出受影响行数 ``` 查找单条记录: ```go var user User db.First(&user, 1) // 查找 ID=1 的第一条记录 fmt.Printf("%v\n", user.Name) ``` 删除记录: ```go db.Delete(&user, 1) // 删除 ID=1 的记录 ``` 这些只是 GORM 功能的一小部分演示;更多高级特性如事务处理、嵌套预取等都可以在其官方文档找到详细描述[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值