?主要關注訪問pg。不關心其他db
1?clojure.java.jdbc
[org.clojure/java.jdbc "0.7.9"] [org.postgresql/postgresql "42.2.5"]
問題是,每次查詢都要單獨連接一次db, 原生只支持3種復用方式:
Using?
with-db-connection
Using?
with-db-transaction
Using Connection Pooling(第三方)
沒有通常的connection cursor 機制,不知道怎么想的……
懶得搭理,不貼代碼了。
2?jdbc.core
:dependences
[funcool/clojure.jdbc "0.9.0"]
使用時
(require '[jdbc.core :as jdbc])
https://funcool.github.io/clojure.jdbc/latest/#introduction
這個中規中矩的。有通常的connection cursor ,但是連接db時用的db-spec的定義和前面那個不一樣,另搞了一套,也沒什么可說的。平淡無奇,感覺就是py里的psycopg2
3 korma
這個更類似SQLalchmey,訪問哪個table前,還要聲明一下table格式,瘋了! 就是為了擺脫這種OO風格才投奔lisp的啊啊啊!
?
4 clj-postgresql
https://github.com/remodoy/clj-postgresql
這個因為專門針對pg,所以優點很多:
1 支持用環境變量PGHOST,?PGPORT,?PGUSER PGDATABASE隱式定義連接 免去db-spec這種硬編碼,不但節省代碼行數,也對運行在docker容器里的應用特別方便。docker-compose里設置就好了。
2 在兼容clojure.java.jdbc的query語句前提下,簡潔實現了類似cursor的connection pool?pg/pool,可以直接
(j/query @db ["select * from schema.table"])2?居然支持postgis的類型!
?這才是真正節約廢話套話,專注表達的庫
那么就用它了!
[clj-postgresql "0.7.0"]
?這個庫發布好幾年了,算上我的一票,在github只有區區91顆星而已。和PY動輒上千相比,用Clojure的人真的很少啊
?
總結
每個庫為了避免直接寫SQL,都搞一套微型、閹割版的DSL,我實在不喜歡這樣。
其實SQL本身表達能力已經非常好了,連接數據庫也是個標準問題,為什么寧可自己發明DSL小方言,不去學SQL大外語。 不可理解。
?
SQL的背后是集合、數論,一階謂詞邏輯;
而LISP的背后是lambda演算。
其實正好優勢互補:
SQL存儲狀態,或者說事實的集合,解決基于集合的計算與查詢,? 特別煩的復雜查詢直接交給lisp就好了;
而LISP抽象動詞,最簡潔地表達AST,最適合表達復制的分支流程。
——后端這2個元老一結合,優勢互補之后,就沒OO這個半吊子什么事啦!
其實OO作為基本類型str等等,或者作為GUI web component? 或者u3d里的GameObject 都是很好的
但是類是非常少的。
類是基礎設施,是有豐富app開發經驗的framework作者給app開發新手提供的基礎設施的抽象.
絕大多數單例類都可以不存在。程序也不應該從class寫起.
?
?
?
?
?
?