Golang oracle使用
在Go
语言中,对Oracle
进行操作,比访问其他常见DB可谓是要麻烦一些,显而易见的问题是库的选择,这里我尝试了两种库:
-
go-ora + 官方库database/sql (github.com/jmoiron/sqlx、github.com/blockloop/scan 辅助)
库的选择
go-ora
是原生Go实现的,不需要依赖CGo,相对比较方便,也比较易用,但在使用过程中,使用该库连接Oracle一段时间后,其会请求出错,我也对此提了issue
,以及解决方法,但由于联系不上maintainer
,所以无法确认解决方法是否靠谱了。
https://github.com/sijms/go-ora/issues/240
也有人遇到了与我相似的问题,用我issue上提到的解决方式解决了该问题,但我依然不推荐这么操作。
go-oci8
是使用了CGo实现了Oracle的客户端,虽然对环境有所依赖,好在库很稳定,不用担心出幺蛾子,且xorm
实验性的支持,对只使用oracle基础功能来说,还是够用的。
推荐使用下面这种。
SQL使用
大小写
在使用oracle
Console时,输入表名、字段,不管大小写都可以识别。但其实这里有个误区。
Oracle默认是大写的
,也就是说在没有使用双引号"
对表名和列名进行限定的时候,表名不过是小写还是大写,最后都默认成了大写。
若是以双引号进行限定后,字段大小写就不再转化为默认的大写了。
1 | CREATE TABLE department ( |
上面字段都会转化为大写,DEPARTMENT
,ID
,DESCRIPTION
。
1 | SELECT id FROM department; √ |
明白上述所述后,使用xorm
时需要注意的是。
在使用xorm自动创建表时,其会根据你的注释的大小写,创建字段。这里就要区分一下了。
1 | type Info struct { |
时间
对时区的设置,这里是:
1 | ALTER DATABASE SET TIME_ZONE='Asia/Shanghai'; |
update_time
、created_time
常见的两个时间,保存时间戳是没有什么问题(int64
)。但要保存time时间格式,估计会发现没法存进去。
update_time
可以使用raw sql:
1 | UPDATE xxxx SET "max_id"="max_id" + "step", "update_time" = TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS.FF6') WHERE "biz_tag"='123' |
created_time
:
1 | CREATE TABLE "xxxxxx"( |
主键
12版本以前没法像MySQL
一样生成自增主键,需要一些曲线救国的方式。
使用SYS_GUID()
,系统根据当前时间和机器码,生成全球唯一的一个序列号。
1 | CREATE TABLE department ( |
自增ID的实现:
1 | Oracle 12c之前: |
本文标题:Golang oracle使用
文章作者:小师
发布时间:2022-10-27
最后更新:2023-04-01
原始链接:chunlife.top/2022/10/27/Golang-oracle使用/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可