Clojure - 資料庫



為了使用資料庫功能,請確保首先從以下網址下載jdbc 檔案https://codeload.github.com/clojure/java.jdbc/zip/master

您會找到一個 zip 檔案,其中包含 Clojure 連線到資料庫所需的驅動程式。解壓縮 zip 檔案後,請確保將解壓縮後的位置新增到您的類路徑。

資料庫連線的主要檔案是位於 clojure/java 目錄下的名為jdbc.clj的檔案。

Clojure jdbc 聯結器支援多種資料庫,其中一些如下所示。

  • H2 資料庫
  • Oracle
  • Microsoft SQL Server
  • MySQL
  • PostgreSQL

在我們的示例中,我們將使用 MySQL 資料庫作為示例。

在 Clojure 中,可以使用以下資料庫操作。

資料庫連線

在連線到 MySQL 資料庫之前,請確保以下事項:

  • 您已建立資料庫 TESTDB。

  • 您已在 TESTDB 中建立表 EMPLOYEE。

  • 此表包含欄位 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。

  • 已設定使用者 ID“testuser”和密碼“test123”以訪問 TESTDB。

  • 確保您已下載“mysql jar 檔案”並將該檔案新增到您的類路徑。

  • 您已學習 MySQL 教程以瞭解MySQL 基礎知識

語法

以下是 Clojure 中建立連線的語法。

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

引數 - “connection_name”是要賦予連線的名稱。“subprotocol”是用於連線的協議。預設情況下,我們將使用 mysql 協議。“subname”是要連線到的 mysql 資料庫的 url,以及資料庫名稱。“user”是用於連線到資料庫的使用者名稱。“password”是用於連線到資料庫的密碼。

返回值 - 這將提供一個連線字串,可在後續的 mysql 操作中使用。

以下示例演示如何連線到 information_schema 中的表並檢索表中的所有資料。

示例

(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”是用於連線到資料庫的連線的名稱。“query”是從資料庫中獲取資料的查詢字串。“:sequence”預設情況下是所有從資料庫中獲取的資料行,並作為序列返回。然後可以對序列執行必要的運算以檢視已獲取的資料。

返回值 - 這將返回一個序列,其中包含查詢操作的資料行。

以下示例演示如何連線到 employee 表並獲取表中行的 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)))

從上面的程式碼中,我們可以看到

  • “select first_name from employee”查詢作為查詢字串傳遞。

  • “:first_name”是作為獲取操作的結果返回的序列。

如果我們假設我們的資料庫中只有一行包含 first_name 值為 John,則上述程式的輸出如下。

(John)

插入資料

當您想將記錄建立到資料庫表中時,需要這樣做。以下是使用 Clojure 插入資料的語法。這是透過使用‘insert!’函式完成的。

語法

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

引數 - “:table_name”是要進行插入操作的表的名稱。“{:column_namen columnvalue}”是所有列名和值的對映,需要將其作為一行新增到表中。

返回值 - 如果插入成功,則返回 nil。

以下示例演示如何將記錄插入 testdb 資料庫的 employee 表中。

示例

(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 資料庫和 employee 表,您將看到上面一行已成功插入到表中。

刪除資料

可以使用‘delete!’函式從表中刪除行。以下是執行此操作的語法。

語法

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

引數 - “:table_name”是要進行刪除操作的表的名稱。“condition”是用於確定要從表中刪除哪一行的條件。

返回值 - 這將返回已刪除的行數。

以下示例演示如何從 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”是要更新的列,以對映的形式提及。“condition”是用於確定要從表中刪除哪一行的條件。

返回值 - 這將返回已更新的行數。

以下示例演示如何從 testdb 資料庫的 employee 表中刪除記錄。該示例根據年齡等於 30 的條件更新表中的一行,並將 income 的值更新為 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 的記錄,則該行的 income 值將被設定為 40。

事務

事務是確保資料一致性的機制。事務具有以下四個屬性:

  • 原子性 - 事務要麼完成,要麼什麼也不發生。

  • 一致性 - 事務必須從一致狀態開始,並使系統處於一致狀態。

  • 隔離性 - 事務的中間結果在當前事務之外不可見。

  • 永續性 - 一旦事務提交,其效果將是持久的,即使在系統故障之後也是如此。

示例

以下示例演示如何在 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])))
廣告