I&#x27;m using postgres and clojure for quite a few enterprises and my typical approach is to keep the raw sql files somewhere (resources&#x2F;sql&#x2F;) so that I can execute it via CLI (say psql) as well as from within clojure (by parsing the files and putting them in a JDBC transaction)<p>From this I derive both the database schema itself as well as implementation details (e.g., check what columns are in a table or see if the current DB schema agrees with the current SQL schema in resources&#x2F;sql)<p>For program internal representation I have my own &quot;classes&quot; (hash maps with a few pre&#x2F;post assertions on key points) and I just use a single db.clj file that needs to be adapted when the SQL representation changes.<p>I also worked a lot with Java and Hibernate and it just feels verbose to change a simple datatype definition in both the application and the db. In a way, with clojure I get DB &#x2F; App consistency that I wouldn&#x27;t get with Java and&#x2F;or types. I haven&#x27;t had the chance to use scala, however.<p>I also worked with MongoDB (when I started with clojure) and I agree, there it is very easy to make mistakes but maybe I would do things now differently if I used it again.