当我从 Clojure (jdbc) 查询 MySQL 时,字段不会按照 SELECT 子句中指定的顺序返回(我正在调用执行选择的存储过程)。最初,这些字段似乎以相反的顺序返回,但只有当有 1 到 9 个字段时才会发生这种情况。添加第十个字段会使结果集没有特定的顺序,尽管结果集中特定数量的字段的顺序始终相同。
有人观察过吗?
当我从 Clojure (jdbc) 查询 MySQL 时,字段不会按照 SELECT 子句中指定的顺序返回(我正在调用执行选择的存储过程)。最初,这些字段似乎以相反的顺序返回,但只有当有 1 到 9 个字段时才会发生这种情况。添加第十个字段会使结果集没有特定的顺序,尽管结果集中特定数量的字段的顺序始终相同。
有人观察过吗?
这些字段很可能按顺序返回,然后由 clojure jdbc 库打包到的数据结构重新排序。假设您使用的是 clojure.java.jdbc,结果将在如下映射列表中返回:
{:name "Apple" :appearance "rosy" :cost 24}
{:name "Orange" :appearance "round" :cost 49}
其中每张地图是一行。行的顺序将被保留,因为它们显示在列表中,尽管字段的顺序不是因为它们显示在地图中(这不保证顺序。如果您需要特定的顺序或调用,您可以在后面对它们进行排序
您可以通过传递给java.jdbc 来要求java.jdbc将单个行作为向量而不是映射(或数组,尽管有选项名称)返回;然后将保留字段顺序::as-arrays? true
query
;; checked with java.jdbc 0.3.0-alpha4
(query db [sql params...] :as-arrays? true)
请注意,在这种操作模式下,包含与列名对应的键(否则将在构造的映射中使用)的额外向量将被添加到实际结果向量的序列之前。
默认情况下,java.jdbc 根据 Arthur 的回答将行作为映射返回。这些将是最多 9 个条目的数组映射(保持插入顺序)和超出此阈值的哈希映射(没有有用的排序)。