Golang使用xormplus访问Oracle无法获取数据

问题描述:

可以连接上,也可以直接执行SQL,但是使用ORM映射strut结构后,无论是Find还是Insert,都无法正确获得返回。

示例(这样是可以的):

record, _ := engine.QueryString("select * from user")

示例(这样是不行的):

var fm []bean.BaseFm
engine.Find(&fm)

类似的问题,在stackoverflow.com也找到了,但是没有说怎么解决。

https://stackoverflow.com/questions/55664155/how-to-get-table-values-by-xorm-from-oracle-db

看上去和我情况类似,不过他用的是xorm,我用的是xormplus。

后来xorm我没有尝试,xormplus中我debug追踪了SQL的生成情况,发现SQL生成后,都会被加上中括号。类似这样:

insert into [user]([id],[name]) values (?,?)

找到源头是xormplus/xorm下的engine.go里有一个Quote方法,第213行有这么一句

quotePair := engine.dialect.Quote("")

这个值是根据Dialect(即DriverName)来的,类似MySQL,其值就是“`”,我的DriverName是oci8,不过不知道为什么值是“[]”,而且直接改Quote方法的参数是没用的,于是我在后一行加了这么一句:

if(engine.DriverName()=="oci8"){
	quotePair = "  "
}

后面的代码有对quotePair判断,即必须长度是2,由此才能使用“[”在前,“]”在后,把单词“括”起来。

纵观对Oracle里SQL的了解,应该不需要括任何内容(值在SQL中是用占位符?表示的,所以不需要单引号括起来),所以这里就用了两个空格。

然后问题就解决了。会不会引起其他问题现在还没发现,后续可以跟踪一下。

ps.之前试图通过创建一个简单的持久层框架(工具集、Util包)来学习Golang,后来发现,xorm(xormplus)虽然顶着ORM的名字,不过也支持直接SQL取数据,因为返回的是map数组,所以形式和JFinal中的List<Record>很像。于是,突然所有的动力化为乌有,还是像写作一样,一步步从“阅读”->“模仿”->“习作”这种节奏来吧。

 

2020.03.09

今天在用createTables方法时,发现又报错表名不存在,建表的SQL还是有[]这样的符号,经排查,终于找到了源头。

在xormplus/xorm/dialect_oracle.go里有这一个方法。改成如下内容即可。

func (db *oracle) Quote(name string) string {
	return name
	//return "[" + name + "]"
}

上文中对oci的判断,也可以去掉了。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值