2013-05-11 26 views
1

当我从Clojure(jdbc)查询MySQL时,字段不会按照SELECT子句中指定的顺序返回(我正在调用一个执行select操作的存储过程)。最初似乎这些字段是以相反的顺序返回的,但是这只有在有1到9个字段的情况下才会发生。添加第十个字段使得结果集没有特定的顺序,尽管结果集中的特定数量的字段总是相同的顺序。从Clojure JDBC查询MySQL的字段顺序

任何人都观察过它?

+1

你能告诉我们一些代码吗?我从未在Clojure中做过这件事。你使用java jdbc库还是clojure库? – 2013-05-11 22:39:02

+1

查询返回的数据类型是什么?基于额外结果的重新排序听起来类似于将更多项添加到散列图时键的顺序会发生什么。当我做jdbc查询时,结果以任何顺序返回到一个向量中,我告诉sql将它们放入。 – noisesmith 2013-05-12 06:54:01

回答

1

你可以问java.jdbc通过传递:as-arrays? truequery到各行返回作为载体,而不是地图(或阵列,尽管选项名称的);然后字段顺序将被保留:

;; checked with java.jdbc 0.3.0-alpha4 
(query db [sql params...] :as-arrays? true) 

注意在这种操作模式下,包含与列名对应的键的额外矢量(​​否则将在构建的地图中使用)将被准备结束于实际结果向量的序列。

默认情况下,按照Arthur的回答,java.jdbc将行作为地图返回。这些将是最多9个条目的数组映射(保持插入顺序)和超出此阈值的散列映射(没有有用的排序)。

1

这些字段最有可能是按顺序返回,然后再按照clojure jdbc库打包的数据结构重新排序。假设你正在使用clojure.java.jdbc结果在这样的地图列表返回:

{:name "Apple" :appearance "rosy" :cost 24} 
{:name "Orange" :appearance "round" :cost 49} 

其中每个地图是一个行。行的顺序将被保留,因为它们以列表形式呈现,但是这些字段的顺序并不是因为它们在地图中呈现(不保证顺序),如果您需要特定顺序或呼叫