问题描述:
可以连接上,也可以直接执行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的判断,也可以去掉了。