Clojure-databases

提供:Dev Guides
移動先:案内検索

Clojure-データベース

データベース機能を使用するには、まず次のURLから* jdbcファイル*をダウンロードしてください-https://codeload.github.com/clojure/java.jdbc/zip/master

Clojureがデータベースに接続するために必要なドライバーを含むzipファイルがあります。 zipファイルを抽出したら、解凍した場所をクラスパスに追加してください。

データベース接続のメインファイルは、clojure/javaの場所にある jdbc.clj というファイルです。

clojure jdbcコネクターは、さまざまなデータベースをサポートしていますが、その一部は次のとおりです。

  • H2Database
  • オラクル
  • Microsoft SQL Server
  • MySQL
  • PostgreSQL

この例では、MySQL DBを例として使用します。

Clojureでは、データベースに関して次の操作が可能です。

データベース接続

MySQLデータベースに接続する前に、次のことを確認してください-

  • データベースTESTDBを作成しました。
  • TESTDBにテーブルEMPLOYEEを作成しました。
  • このテーブルには、FIRST_NAME、LAST_NAME、AGE、SEX、およびINCOMEフィールドがあります。
  • ユーザーID「testuser」とパスワード「test123」は、TESTDBにアクセスするように設定されています。
  • 「mysql jarファイル」をダウンロードし、ファイルをクラスパスに追加したことを確認してください。
  • MySQL Basicsを理解するためにMySQLチュートリアルを完了しました。

構文

Clojureで接続を作成する構文は次のとおりです。

(def connection_name {
   :subprotocol “protocol_name”
   :subname “Location of mysql DB”
   :user “username” :password “password” })

パラメータ-「connection_name」は、接続に付けられる名前です。 「サブプロトコル」は、接続に使用されるプロトコルです。 デフォルトでは、mysqlプロトコルを使用します。 「サブネーム」は、データベース名とともにmysql dbに接続するURLです。 「user」は、データベースへの接続に使用されるユーザー名です。 「パスワード」は、データベースへの接続に使用されるパスワードです。

戻り値-これは、後続のmysql操作で使用できる接続文字列を提供します。

次の例は、情報スキーマ内のテーブルに接続し、テーブル内のすべてのデータを取得する方法を示しています。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/information_schema"
      :user "root"
      :password "shakinstev"})
   (println (sql/query mysql-db
      ["select table_name from tables"]
      :row-fn :table_name)))

データのクエリ

任意のデータベースのデータを照会すると、データベースからいくつかの有用な情報を取得することを意味します。 データベース接続が確立されると、このデータベースにクエリを実行する準備が整います。 以下は、Clojureを使用してデータを照会できる構文です。

構文

clojure.java.jdbc/query dbconn
["query"]
   :row-fn :sequence

パラメータ-「dbconn」は、データベースへの接続に使用される接続の名前です。 「クエリ」は、データベースからデータを取得するために使用されるクエリ文字列です。 「:sequence」はデフォルトで、データベースからフェッチされたデータのすべての行であり、シーケンスとして返されます。 その後、シーケンスで必要な操作を実行して、フェッチされたデータを確認できます。

戻り値-これは、クエリ操作からのデータの行を持つシーケンスを返します。

次の例は、従業員表に接続し、表の行のfirst_name列をフェッチする方法を示しています。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/query mysql-db
      ["select first_name from employee"]
      :row-fn :first_name)))

上記のコードから、次のことがわかります。

  • 「従業員からfirst_nameを選択」のクエリがクエリ文字列として渡されます。
  • :first_nameは、フェッチ操作の結果として返されるシーケンスです。

データベースにJohnのfirst_name値を含む行が1つしかないと仮定すると、上記のプログラムの出力は次のようになります。

(John)

データの挿入

データベーステーブルにレコードを作成する場合に必要です。 以下は、Clojureを使用してデータを挿入できる構文です。 これは、*「挿入!」*関数を使用して行われます。

構文

clojure.java.jdbc/insert!
   :table_name {:column_namen columnvalue}

パラメータ-「:table_name」は、挿入が必要なテーブルの名前です。 「\ {:column_namen columnvalue}」は、すべての列名と値のマップであり、テーブルに行として追加する必要があります。

戻り値-挿入が正常に行われると、nilが返されます。

次の例は、testdbデータベースの従業員テーブルにレコードを挿入する方法を示しています。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (sql/insert! mysql-db
      :employee {:first_name "John" :last_name "Mark" :sex "M" :age 30 :income 30}))

MySQLデータベースと従業員テーブルを確認すると、上記の行がテーブルに正常に挿入されていることがわかります。

データを削除する

  • 「delete!」*関数を使用して、テーブルから行を削除できます。 以下は、この操作を実行する方法の構文です。

構文

clojure.java.jdbc/delete!
   :table_name [condition]

パラメータ-「:table_name」は、挿入が必要なテーブルの名前です。 「条件」は、テーブルから削除する必要がある行を決定するために使用される条件です。

戻り値-これは削除された行の数を返します。

次の例は、testdbデータベースのemployeeテーブルからレコードを削除する方法を示しています。 この例では、年齢が30に等しいという条件に基づいて、テーブルから行を削除します。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/delete! mysql-db
      :employee ["age = ? " 30])))

年齢が値30に等しい行を持つレコードがある場合、その行は削除されます。

データの更新

*'update!'* 関数を使用して、テーブルから行を更新できます。 以下は、この操作を実行する方法の構文です。

構文

clojure.java.jdbc/update!
   :table_name
{setcondition}
[condition]

パラメータ-「:table_name」は、挿入が必要なテーブルの名前です。 「setcondition」は、マップの項で述べたように更新する必要がある列です。 「条件」は、テーブルから削除する必要がある行を決定するために使用される条件です。

戻り値-これは更新された行の数を返します。

次の例は、testdbデータベースのemployeeテーブルからレコードを削除する方法を示しています。 この例では、年齢が30に等しいという条件に基づいてテーブルの行を更新し、収入の値を40に更新します。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/update! mysql-db
      :employee
      {:income 40}
      ["age = ? " 30])))

年齢が値30に等しい行を持つレコードがある場合、その行は更新され、収入の値は40に設定されます。

トランザクション

トランザクションは、データの一貫性を保証するメカニズムです。 トランザクションには、次の4つのプロパティがあります-

  • Atomicity -トランザクションが完了するか、まったく何も起こりません。
  • 一貫性-トランザクションは一貫した状態で開始し、システムを一貫した状態のままにする必要があります。
  • 分離-トランザクションの中間結果は、現在のトランザクションの外部では見えません。
  • 耐久性-トランザクションがコミットされると、システム障害が発生した後でも効果は持続します。

次の例は、Clojureでトランザクションを実装する方法を示しています。 トランザクションで実行する必要のある操作は、 'with-dbtransaction' 句に埋め込む必要があります。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (sql/with-db-transaction [t-con mysql-db]
      (sql/update! t-con
         :employee
         {:income 40}
         ["age = ? " 30])))