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
相关产品推荐
相关产品推荐

