Keep the database at the edge: manage connections, map rows to data, and keep queries testable.
Database access is an I/O boundary, so it fits naturally in the “impure shell” of a Clojure service. Your core stays pure; the DB layer turns rows into maps and maps into parameters.
This section focuses on practical integration: connection lifecycle, transaction boundaries, and keeping SQL/queries understandable in code review.