clojure with postgres
主要关注访问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写起.
clojure with postgres的更多相关文章
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- postgres创建表的过程以及部分源码分析
背景:修改pg内核,在创建表时,表名不能和当前的用户名同名. 首先我们知道DefineRelation此函数是最终创建表结构的函数,最主要的参数是CreateStmt这个结构,该结构如下 typede ...
- postgres索引创建、 存储过程的创建以及在c#中的调用
postgres创建索引参考 http://www.cnblogs.com/stephen-liu74/archive/2012/05/09/2298182.html CREATE TABLE tes ...
- clojure基础入门(一)
最近在看storm的源码,就学习分享下clojure语法. 阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以 ...
- postgres扩展开发
扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...
- oracle迁移postgres之-Ora2Pg
描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...
- oracle迁移postgres之-oracle_fdw
1. 安装oracle_fdw 在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加: export ORACLE_HOME=/u01/app/oracle expo ...
- windows安装postgres源代码
http://blog.csdn.net/adrastos/article/details/9093739 1. 下载PostgreSQL的源代码.解压. 2. 在Windows平台下编译需要跳过一个 ...
- postgres 类型转换 cast 转
转自: http://blog.csdn.net/yufenghyc/article/details/45869509 --1 例子postgres=# select 1/4; ?column? -- ...
随机推荐
- jdbcTemplate学习(二)
前面讲了增加.删除.更新操作,这节讲一下查询. 查询操作: (一)查询一个值(不需要注入参数) queryForObject(String sql, Class<T> requiredTy ...
- BigDecimal的equals与compareTo
equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度, compareTo方法则不会比较精确度,只比较数值的大小
- 修改linux内核启动logo及显示位置
转载于:http://blog.chinaunix.net/uid-28458801-id-3484269.html 在此基础上我又添加了我的一些不同的地方,仅供参考 内核版本: 2.6.35.3 l ...
- 框架之 hibernate之关联关系映射
案例:完成CRM的联系人的保存操作 需求分析 1. 因为客户和联系人是一对多的关系,在有客户的情况下,完成联系人的添加保存操作 技术分析之Hibernate的关联关系映射之一对多映射(重点) 1. J ...
- Angular18 RXJS
1 RX 全称是 Reactive Extensions,它是微软开发并维护的基于 Reactive Programming 范式实现的一套工具库集合:RX结合了观察者模式.迭代器模式.函数式编程来管 ...
- mac上virtualBox的安装和使用
一.下载和安装 去oracle官网下载mac版的virtualBox. 官网下载地址:https://www.virtualbox.org/. 下载好后按照向导进行安装即可. 二.使用方法 1.新建虚 ...
- 771. Jewels and Stones珠宝数组和石头数组中的字母对应
[抄题]: You're given strings J representing the types of stones that are jewels, and S representing th ...
- JavaPersistenceWithMyBatis3笔记-第1章-001
一.介绍 1.项目结构 2.数据库结构 二.代码 1.Mapper package com.mybatis3.mappers; import java.util.List; import com.my ...
- MySQL介绍与安装
mysql介绍 #mysql就是一个基于socket编写的C/S架构的软件 #客户端软件 mysql自带:如mysql命令,mysqldump命令等 python模块:如pymysql 数据库管理软件 ...
- Mat类的输出格式
从前面的例程中, 可以看到 Mat 类重载了<<操作符, 可以方便得使用流操作来输出矩阵的内容.默认情况下输出的格式是类似 Matlab 中矩阵的输出格式.除了默认格式,Mat 也支持其他 ...