clojure with postgres

 主要關注訪問pg。不關心其餘dbhtml

1 clojure.java.jdbc

這個最廣,須要配合不一樣DB
[org.clojure/java.jdbc "0.7.9"]
[org.postgresql/postgresql "42.2.5"]

問題是,每次查詢都要單獨鏈接一次db, 原生只支持3種複用方式:java

Using with-db-connectiongit

Using with-db-transactiongithub

Using Connection Pooling(第三方)web

沒有一般的connection cursor 機制,不知道怎麼想的……sql

懶得搭理,不貼代碼了。docker

2 jdbc.core

:dependences數據庫

[funcool/clojure.jdbc "0.9.0"]

使用時後端

(require '[jdbc.core :as jdbc])

https://funcool.github.io/clojure.jdbc/latest/#introductionapp

這個中規中矩的。有一般的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的類型!

 這纔是真正節約廢話套話,專一表達的庫

那麼就用它了!

:dependences
[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寫起.

相關文章
相關標籤/搜索