web-dev-qa-db-ja.com

Clojureでデータベースを使用する

Clojureのデータベースを使用する方法は何ですか?

Clojureから、Javaでできることは何でもできることを知っていますが、それは、Clojureの単純さと衝突する過度に複雑なもの(Hibernateなど)を使用してしまう可能性があることを意味します。推奨事項やコメントはありますか?

40
pupeno

clojure-contrib には、JDBC(Java.sql.DriverManager)のシンラッパーであるSQLライブラリがあります。付属のテストファイルには、その使用例がいくつかあります。

19
Brian Carper

私は今(2011年後半の時点で)お勧めします Korma -"Clojure用のおいしいSQL"

これは美しい小さなSQLDSLです。これがWebサイトの例です。

(select users
  (aggregate (count :*) :cnt)
  (where (or (> :visits 20)
             (< :last_login a-year-ago))))
14
mikera

Javaライブラリを使用することにオープンであるが、単純さを取り入れたものが必要な場合は、おそらく Persist が好きです。たった10分でそれがあなたのニーズに合うかどうか見てください。

8
foxdonut

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を作成するには、OVERPARTITION BYなどの追加の句を使用してhoneysqlを拡張する必要がありました。そよ風とは言えませんが、とてもうまくいったようです。

.。

これにより、SQLは(場合によっては)GBのスクリプトから約100行のSQLに削減され、場合によっては、ランタイムが19時間から1.5分に短縮されました。」

Yesqlは、一方で、完全な単純さを目指しています。パラメータ化された.sql-ファイルをロードするためのいくつかの関数を定義します。

このWebページには、次の「USP」が記載されています。

  • 構文上の驚きはありません。あなたのデータベースはSQL標準に固執していません-それらのどれも固執していません-しかしYesqlは気にしません。 「同等のsexp構文」を探すのに時間を費やすことは決してありません。 (raw-sql "some('funky'::SYNTAX)")関数にフォールバックする必要はありません。
  • より良いエディターサポート。あなたのエディタはおそらくすでに素晴らしいSQLサポートを持っています。 SQLをSQLとして保持することにより、それを使用できるようになります。
  • チームの相互運用性。 DBAは、Clojureプロジェクトで使用するSQLを読み書きできます。
  • より簡単なパフォーマンスチューニング。そのクエリプランを説明する必要がありますか?クエリが通常のSQLの場合は、はるかに簡単です。
  • クエリの再利用。同じSQLファイルを他のプロジェクトにドロップします。これらは単なる古いSQLだからです。それらをサブモジュールとして共有します。
8
claj

Googleからここに来る人のために、2011年11月現在の回答を追加したいと思います。

Clojure1.3の現在のコアSQLアクセスライブラリはclojure.Java.jdbcです。 ClojureQLKorma のように、この上に構築された非常に優れたライブラリがいくつかあります。

8
John Cromartie

Clojureの単純なキー/値データベースに Berkeley DB を使用しました。 ここ を参照してください。

5
Mark Probst

今日では、 Datomic と、非常に興味深いリレーショナル(非sql!)データベース機能のための DataScript のような多くの同様のソリューションがあります。

4
claj

ClojureQL があります。これは関係代数を包含します。

4
Jeff the Bear

まず、ライブラリをからインポートします

 (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は、システムがどのテーブルにどのデータベース接続のレコードを挿入する必要があるかを理解できるようにします。

1
Satyam Ramawat

永続的な接続や複数のデータベースへの接続が必要で、接続を頻繁に再確立したくない場合は、DB接続プールを使用することをお勧めします。 BoneCPやTomcatCPのようなもの。

これらのパッケージから(clojure.contrib.sql/with-connection ...)にデータソースを提供できます。

1
jartur

次に、SQLLiteがあります。この簡単な例を見てください: https://github.com/ogrim/clojure-sqlite-example

1
Terje Dahl

CLJ-Recordを試すこともできます https://github.com/duelinmarkers/clj-record

0
Yazz.com