25

それぞれが特定の列の選択や述語によるフィルタリングなどの基本的なケースをカバーしているように見えますが、それぞれがより高度なケースとどのように比較されるのか疑問に思います。複雑なクエリを一方の形式でもう一方の形式で表現する方が簡単ですか?1つのライブラリに、他のライブラリがカバーする機能が欠けていませんか?

4

1 に答える 1

37

ClojureQLとclojure.contrib.sqlは、まったく異なる2つのライブラリです。1つ目は、関係代数からプリミティブを実装し、それらをSQL92にコンパイルすることを目的としています。また、データベース固有のSQLダイアレクトに適応できる拡張可能なコンパイラも提供します。2つ目は、ClojureコードからJDBCを使用するための軽量のヘルパーセットです。

クエリ

clojure.contib.sql

clojure.contib.sqlでは、SQLを使用してクエリを作成する必要があります。次に例を示します。

(sql/with-connection db
  (sql/with-query-results rs ["select * from customer"]
    (doseq [r rs] (println (:lastname r))))

ClojureQL

ClojureQLは主にクエリ言語であるため、SQLクエリを作成するための豊富なClojureベースのDSLを提供します。高度な例をスキップして、上記のクエリに相当するClojureQLのみを示します。

(sql/with-connection db
  (cql/with-results [rs (cql/table :customer)]
    (doseq [r rs] (println (:lastname r))))

どちらでも任意の複雑さのクエリを表現できますが、contrib.sqlではSQLコードを記述する必要があります。標準SQLに対するClojureQLDSLの主な利点は構成可能性であることに注意してください。そのtable関数はRTable、指定されたテーブルのクエリを表すオブジェクトを返します。他のClojureQL関数をそのオブジェクトにチェーンして、必要なクエリを作成し、それを逆参照して実行できます。より複雑なクエリを作成する方法の詳細については、ClojureQLの例のページドキュメントを参照してください。

挿入、更新、削除

clojure.contib.sql

clojure.contrib.sqlは、行を挿入、更新、および削除するための包括的な関数セットを提供します。

  • 挿入
    • (insert-records table & records)、レコードはマップです
    • (insert-rows table & rows)、ここで行はベクトルです
    • (insert-values table column-names & value-groups)
  • 更新(update-values table where-params record)
  • 挿入または更新(update-or-insert-values table where-params record)
  • 削除(delete-rows table where-params)

ClojureQL

ClojureQLはRTable、指定されたテーブルデータを操作するための3つのメソッドを提供します。

  • conj!これはcontrib.sqlのショートカットですinsert-records
  • disj!これはcontrib.sqlのショートカットですdelete-rows
  • update-in!これはcontrib.sqlに似ていますupdate-or-insert-values

これらには、ClojureQL述語構文を使用するという利点がありますが、現時点では、ClojureQLのこの部分は、コンパイラーから分離されているため、データベースに依存しないSQLを生成していません。近い将来、私が書いた別のライブラリのコードをマージすることで、これを修正するつもりです。

スキーマ操作

clojure.contib.sql

clojure.contrib.sqlは、テーブルの作成と削除のみを提供しcreate-tableますdrop-table。これらは非常に単純な関数であり、コードを移植可能にしないことに注意してください。ALTERテーブルを変更するには、関数を使用してSQLステートメントを送信する必要がありますdo-commands

ClojureQL

スキーマ操作ヘルパーは提供されていません。

ロボス(恥知らずなプラグ;-)

これは、これら2つのライブラリによって残された穴を塞ぐために私が書いたライブラリです。これは進行中の作業ですが、データベースに依存しない方法でDDLステートメントを送信するClojureDSLをすでに入手しています。

テーブルを作成するための基本的な例を次に示します。

(create (table :users (integer :id :unique)))

そしてそれを変更する:

(alter :add (table :users (text :name)))

このライブラリの詳細については、Webサイトまたはgithubページにアクセスしてください。これは、移行や宣言型スキーマ操作などの高レベルの機能を提供することを目的としています。

その他

clojure.contrib.sqlには、いくつかの追加の下位レベルのヘルパーがあります。完全なドキュメントを参照してください。

これらのライブラリがデータベース接続をどのように処理するかについては、さらに多くのことが言えますが、それは別の日に残しておきます。

PS:ClojureQLとLobosはどちらも比較的若いライブラリであり、まだいくつかの作業が必要であることに注意してください。どちらも、SQL言語全体をカバーするDSLであった元のClojureQLプロジェクトから派生しています。ClojureQLにはすでに安定したAPIがありますが、SQL92互換のコンパイラのみを提供します。Lobosは、複数のデータベースをコンパイラーでサポートしています。しかし、まだ活発な開発中であり、そのAPIはまだ変更される可能性があります。

更新:Lauからの提案を受けて、いくつか変更を加えました。ClojureQL自体はデータベースに依存しないことを目的としていませんが、ユーザーがコンパイラーをデータベース固有のものに置き換える手段を提供します。SQLのDML部分は、DDL部分よりもはるかに標準化されていることに注意してください。

于 2011-02-04T07:26:25.923 に答える