go连接Oracle数据库

1,054 阅读3分钟

使用golang连接Oracle数据库

示例代码

package main

import (
	"fmt"
	"github.com/cengsin/oracle"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

type Area struct {
	ID   int    `gorm:"column:ID"`
	Name string `gorm:"column:NAME"`
}

func (Area) TableName() string {
	return "T_AREA"
}
func main() {
	log.Println("initial database connect……")
	db, err := gorm.Open(oracle.Open("wateruser/Sa123456@127.0.0.1:1521/ORCL"), &gorm.Config{
		Logger: logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
			SlowThreshold: 2 * time.Millisecond,
			LogLevel:      logger.Warn, //打印级别
			Colorful:      true,
		}),
		//SkipDefaultTransaction: true,
	})

	if err != nil {
		log.Fatalln(err)
	}

	area := make([]Area, 0, 1)
	res := db.Find(&area)
	if res.Error != nil {
		fmt.Println(res.Error)
	}
	fmt.Println(area)
}

分别拉取两个依赖或者直接执行go mod tidy

go get gorm.io/gorm
go get github.com/cengsin/oracle

注意

go的版本在1.18以上会报错

# github.com/godror/godror
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:479:19: undefined: VersionInfo
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:480:19: undefined: VersionInfo
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:481:30: undefined: ObjectType
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:482:31: undefined: Event
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:482:42: undefined: SubscriptionOption
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:482:64: undefined: Subscription
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:483:10: undefined: StartupMode
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:484:11: undefined: ShutdownMode
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:485:59: undefined: Data
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:488:18: undefined: PoolStats
..\..\gopath\pkg\mod\github.com\godror\godror@v0.20.0\orahlp.go:488:18: too many errors

如果是使用的goland的话,在创建项目时选择go的sdk为1.8即可,这个设置只会对当前项目生效,对系统中go的sdk版本无影响

gorm高版本也会出现错误

......github.com/cengsin/oracle@v1.0.0/oracle.go:53:59: unknown field 'WithReturning' in struct literal of type callbacks.Config” 

可以在go.mod文件中将gorm的版本改为1.21,然后执行

go mod tidy

gcc

如果你的电脑系统中没有gcc,会报错

# github.com/godror/godror
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%

这是需要安装gcc,(这里建议看完gcc这一部分再操作!!!

安装方式一:

点击下面网址即可打开

MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64 at SourceForge.net

然后点击在线安装

image.png

然后打开软件,这一步需要选择与电脑对应的版本(这一界面在打开软件点击一次next后)

img

然后下一步选择你的安装位置

image-20230318140911519.png

这时可能会报错

image-20230318141626952.png 这一版是由于网络导致的,可以采用科学上网解决,也可以不选择在线安装,直接下载对应版本,这一过程可能会很慢

安装方式二:

仍然是这个网址

MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net

我选择的版本是

image-20230318141856172.png

这个版本我上传到了百度网盘,

链接:pan.baidu.com/s/1PZcT6Mtq… 提取码:fzvh --来自百度网盘超级会员V3的分享

里面有两个文件,下载一个即可。官方的文件压缩格式是.7z,而win11只能默认解压.zip,我就一起上传了,但是.7z的文件只有47M,.zip有132M

下载后解压放到一个文件夹,并进入bin目录,复制文件路径

image-20230318151748214.png

添加到环境变量中:此电脑(右键)-属性-高级系统设置-环境变量-(双击)path-新建,然后一路确认即可

添加完成后执行

gcc -v

image-20230318151914315.png

出现版本号则添加成功

成功

再次运行程序,成功

image-20230318152943757.png

测试的时候我还发现gorm的first查询不支持Oracle数据库 最后再吐槽一下掘金这个本地md文件上传时图片无法一起上传的问题,图片文件需要自己一张一张的上传