You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gorm无法从数据库加载UUID的问题求助及代码示例

解决Gorm加载UUID时的扫描错误

错误原因

你遇到的扫描错误,是因为数据库返回的UUID字符串([]uint8类型)在转换为uuid.UUID时,查询方式的适配存在问题,或是使用的数据库驱动未原生支持UUID类型的自动转换。

解决方案

1. 更换为原生支持UUID的数据库驱动

如果使用PostgreSQL,建议替换为pgx驱动(替代传统的lib/pq),它原生支持uuid.UUID类型的扫描与写入,无需额外转换逻辑。
数据库连接初始化示例:

import (
  "gorm.io/driver/postgres"
  "gorm.io/gorm"
)

func main() {
  dsn := "host=localhost user=postgres password=your_password dbname=your_db port=5432 sslmode=disable TimeZone=Asia/Shanghai"
  db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
  // 错误处理...
}

2. 修正查询代码的写法

不要直接用Find(&dbUser.Id)来单字段查询UUID,改用Scan方法或查询完整结构体:

方式一:用Scan直接获取UUID

var userId uuid.UUID
res := db.Table("users").Select("id").Where(
  "username = ?", loginUser.Username,
).Or(
  "email = ?", auth.GenerateSHAHash(loginUser.Username),
).Scan(&userId)

if res.Error != nil {
  log.Panic(res.Error)
}
// userId 即为查询到的UUID

方式二:查询完整User结构体(推荐)

var dbUser User
res := db.Where(
  "username = ?", loginUser.Username,
).Or(
  "email = ?", auth.GenerateSHAHash(loginUser.Username),
).Select("id").First(&dbUser)

if res.Error != nil {
  log.Panic(res.Error)
}
// dbUser.Id 即为查询到的UUID

3. 确认UUID包的兼容性

确保你使用的UUID包与驱动兼容,比如github.com/google/uuid和pgx驱动完美适配,避免使用与驱动不兼容的UUID实现。

内容的提问来源于stack exchange,提问作者Whilez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:55:18