The current performance-focused route is via
reducible!, for processing large result sets. That doesn’t create a hash map at all if you only use operations that lookup keys.
The other two scenarios that are goals of the library are fetch a single, fully-realized row and fetch a fully-realized sequence of rows. I’ve been talking to Ghadi about various options for allowing extensible row-building. If I go that route, it could produce hash maps with qualified keys, arrays of column names/row values, or anything else you want – including records – but qualified keywords will be the default choice because I believe that is the “right” default for most Clojure apps, especially those that also use spec.
I’d be interested in seeing what you have in mind for a separation of “compile” and “execute” (but not as a PR – and I’ll remind everyone of https://github.com/seancorfield/next-jdbc/blob/master/CONTRIBUTING.md at this point).