有哪些方法可以从Clojure使用数据库?
我知道在Clojure中,你可以使用Java可以做的任何事情,但是这意味着我可能会使用一些与Clojure简洁性不符的过于复杂的东西(比如Hibernate)。有什么建议或意见吗?
clojure-contrib有一个与JDBC (java.sql.DriverManager)紧密结合的sql库,它是一个轻量级的包装器。 它附带的测试文件中有一些使用示例。
我现在(截至2011年底)会推荐Korma - "Tasty SQL for Clojure"。
这是一个非常漂亮的小型SQL DSL,以下是来自网站的一个示例:
(select users
(aggregate (count :*) :cnt)
(where (or (> :visits 20)
(< :last_login a-year-ago))))
from
表,一个group-by
和一个order-by
子句来确定哪些是重复项,并按顺序保留记录。与JDBC元数据结合使用,该查询有效地被重写以生成:
为了创建性能最佳但仍与数据库无关的SQL,我不得不使用额外的子句扩展honeysql,如OVER
和PARTITION BY
。我不能说这很轻松,但似乎工作得非常好。
...
"That cut down SQL to (sometimes) GB's of script to around a few 100 lines of SQL, and on one occasion, a runtime from 19 hours to 1.5 minutes."(raw-sql "some('funky'::SYNTAX)")
函数。
- 更好的编辑器支持。您的编辑器可能已经具有出色的SQL支持。通过将SQL保留为SQL,您可以使用它。
- 团队互操作性。您的DBA可以阅读和编写您在Clojure项目中使用的SQL。
- 更容易的性能调整。需要解释查询计划吗?当您的查询是普通的SQL时,这样做会更容易。
- 查询重用。将相同的SQL文件放入其他项目中,因为它们只是普通的SQL。将它们作为子模块共享。。
(ns clojureexercise.test
(:require [clojure.java.jdbc :as sql])) ;;sql will alias used further in code to access java jdbc feature.
其次,下面的函数允许您连接MySQL服务器。就像在Java中,我们声明Database变量来启动DB一样,在这里我们也必须定义数据库连接,并且在下面的代码中,您可以看到db变量在dbconnect函数中被定义。 db变量将在运行查询时进一步使用。
(defn dbconnect []
(def db{
:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname "//127.0.0.1:3306/testdb" ;;testdb is the name of database
:user "root"
:password "password"}))
;;Inserting Data into Database
;;Table Name is patientinfo, consist columns {id, firstname, lastname, birthdate, gender}
(defn insertdata []
(sql/insert! db :patientinfo ;;used sql alias and db variable to insert data into table
{:id 1 :firstname "Satyam" :lastname "Ramawat"
:birthdate "1/1/2018" :gender "Male" }))
sql 将启用插入查询功能,db 将使系统理解要将记录插入哪个数据库连接的哪个表中。请注意保留 HTML 标签。sql/insert! db :patientinfo