Clojureのデータベースを使用する方法は何ですか?
Clojureから、Javaでできることは何でもできることを知っていますが、それは、Clojureの単純さと衝突する過度に複雑なもの(Hibernateなど)を使用してしまう可能性があることを意味します。推奨事項やコメントはありますか?
clojure-contrib には、JDBC(Java.sql.DriverManager)のシンラッパーであるSQLライブラリがあります。付属のテストファイルには、その使用例がいくつかあります。
私は今(2011年後半の時点で)お勧めします Korma -"Clojure用のおいしいSQL"
これは美しい小さなSQLDSLです。これがWebサイトの例です。
(select users
(aggregate (count :*) :cnt)
(where (or (> :visits 20)
(< :last_login a-year-ago))))
Javaライブラリを使用することにオープンであるが、単純さを取り入れたものが必要な場合は、おそらく Persist が好きです。たった10分でそれがあなたのニーズに合うかどうか見てください。
SQLデータベースの最新かつ最高のものは HoneySQL および Yesql のようです。
HoneySQLは、SQLクエリを生成するための非常に洗練されたDSLです。高度に最適化されるようにステートメントを変更することさえできるという噂があります。2015年2月24日のclojure-groupスレッド " 現在の最善のJDBCライブラリ? "を参照してください。
Niels van Klaverenは、上記のスレッドで次のように述べています。
「基本的に、[HoneySQL]は外部キー参照を再リンクしてデータベース内の重複をクリーンアップするSQLスクリプトを生成します。(少なくとも)from
テーブル、group-by
、および基本定義としてのorder-by
句は、何が2倍と見なされ、どの順序でレコードを保持する必要があります。クエリを効果的に書き換えて生成するJDBCメタデータと組み合わせると、
最高のパフォーマンスを発揮しながらデータベースに依存しないSQLを作成するには、OVER
やPARTITION BY
などの追加の句を使用してhoneysqlを拡張する必要がありました。そよ風とは言えませんが、とてもうまくいったようです。
.。
これにより、SQLは(場合によっては)GBのスクリプトから約100行のSQLに削減され、場合によっては、ランタイムが19時間から1.5分に短縮されました。」
Yesqlは、一方で、完全な単純さを目指しています。パラメータ化された.sql
-ファイルをロードするためのいくつかの関数を定義します。
このWebページには、次の「USP」が記載されています。
(raw-sql "some('funky'::SYNTAX)")
関数にフォールバックする必要はありません。Clojureの単純なキー/値データベースに Berkeley DB を使用しました。 ここ を参照してください。
今日では、 Datomic と、非常に興味深いリレーショナル(非sql!)データベース機能のための DataScript のような多くの同様のソリューションがあります。
ClojureQL があります。これは関係代数を包含します。
まず、ライブラリをからインポートします
(ns clojureexercise.test
(:require [clojure.Java.jdbc :as sql])) ;;sql will alias used further in code to access Java jdbc feature.
次に、以下の関数を使用すると、MySQLサーバーに接続できます。 Javaと同様に、データベース変数を宣言して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/insert!db:patientinfo
sqlはクエリの挿入機能を有効にし、dbは、システムがどのテーブルにどのデータベース接続のレコードを挿入する必要があるかを理解できるようにします。
永続的な接続や複数のデータベースへの接続が必要で、接続を頻繁に再確立したくない場合は、DB接続プールを使用することをお勧めします。 BoneCPやTomcatCPのようなもの。
これらのパッケージから(clojure.contrib.sql/with-connection ...)にデータソースを提供できます。
次に、SQLLiteがあります。この簡単な例を見てください: https://github.com/ogrim/clojure-sqlite-example
CLJ-Recordを試すこともできます https://github.com/duelinmarkers/clj-record