使用go-ora驱动连接GORM操作Oracle失败,求解决方案
问题修复方案
错误核心原因
你遇到的编译及运行错误,本质是使用的github.com/cengsin/oracle驱动版本过旧,与当前GORM v1.24.3版本不兼容:
- 编译错误:驱动代码调用GORM的
field.Set方法参数不匹配,且引用了GORM回调配置中不存在的字段 - 运行时错误:驱动处理字段赋值时操作了不可寻址的反射值,属于版本不兼容导致的逻辑问题
具体修复步骤
1. 替换兼容的GORM Oracle驱动
移除旧的github.com/cengsin/oracle依赖,改用适配go-ora且支持新版GORM的github.com/godoes/gorm-oracle:
go get github.com/godoes/gorm-oracle@latest go mod tidy
2. 修改数据库连接代码
调整导入路径和连接逻辑,使用新驱动的正确打开方式:
package database import ( go_ora "github.com/sijms/go-ora" "gorm.io/driver/oracle" "gorm.io/gorm" ) func Setting(databaseInfo YourDBConfigType) (*gorm.DB, error) { urlOptions := map[string]string{} // 根据需求添加连接参数 dsn := go_ora.BuildJDBC(databaseInfo.Username, databaseInfo.UserPassword, databaseInfo.ConnectString, urlOptions) db, err := gorm.Open(oracle.Open(dsn), &gorm.Config{}) if err != nil { return nil, err } // 可选:验证连接可用性 sqlDB, err := db.DB() if err != nil { return nil, err } if err = sqlDB.Ping(); err != nil { return nil, err } return db, nil }
3. 排查剩余运行时错误
如果仍出现reflect: reflect.Value.Set using unaddressable value错误,检查两点:
- 调用GORM方法时传入结构体指针,比如
db.Create(&User{})而非db.Create(User{}) - 确保结构体字段为可导出状态(首字母大写),GORM无法操作非导出字段
内容的提问来源于stack exchange,提问作者madol
相关产品推荐
相关产品推荐

