Clojure 數(shù)據(jù)庫

2021-02-19 13:52 更新

為了使用數(shù)據(jù)庫的功能,請(qǐng)確保首先從以下網(wǎng)址下載JDBC文件 - https://codeload.github.com/clojure/java.jdbc/zip/master

你會(huì)發(fā)現(xiàn)一個(gè)zip文件,它有必要的驅(qū)動(dòng)程序,Clojure有能力連接到數(shù)據(jù)庫。 提取zip文件后,請(qǐng)確保將解壓縮的位置添加到類路徑中。

數(shù)據(jù)庫連接的主文件是位于clojure / java中的名為jdbc.clj的文件。

clojure jdbc連接器支持各種各樣的數(shù)據(jù)庫,其中一些如下。

  • H2Database
  • Oracle
  • Microsoft SQL Server
  • MySQL
  • PostgreSQL

在我們的示例中,我們將使用MySQL DB作為示例。

在Clojure中有關(guān)數(shù)據(jù)庫的以下操作是可能的。

數(shù)據(jù)庫連接

在連接到MySQL數(shù)據(jù)庫之前,請(qǐng)確保以下內(nèi)容

  • 您已創(chuàng)建數(shù)據(jù)庫TESTDB。
  • 您在TESTDB中創(chuàng)建了一個(gè)表EMPLOYEE。
  • 此表格包含F(xiàn)IRST_NAME,LAST_NAME,AGE,SEX和INCOME字段。
  • 用戶ID“testuser”和密碼“test123”設(shè)置為訪問TESTDB。
  • 確保已下載“mysql jar文件”,并將該文件添加到類路徑。
  • 你已經(jīng)通過MySQL教程來了解MySQL基礎(chǔ)。

語法

以下是在Clojure中創(chuàng)建連接的語法。

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

參數(shù) - 'connection_name'是要給連接的名稱。 'subprotocol'是用于連接的協(xié)議。 默認(rèn)情況下我們將使用mysql協(xié)議。 'subname'是連接到mysql數(shù)據(jù)庫的URL以及數(shù)據(jù)庫名稱。 'user'是用于連接到數(shù)據(jù)庫的用戶名。 'password'是用于連接到數(shù)據(jù)庫的密碼。

返回值 -這將提供一個(gè)連接字符串,可以在后續(xù)的mysql操作中使用。

以下示例顯示如何連接到信息模式中的表并檢索表中的所有數(shù)據(jù)。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "http://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)))

數(shù)據(jù)查詢

在任何數(shù)據(jù)庫上查詢數(shù)據(jù)意味著從數(shù)據(jù)庫獲取一些有用的信息。 一旦建立了數(shù)據(jù)庫連接,就可以對(duì)該數(shù)據(jù)庫進(jìn)行查詢。 

以下是使用Clojure查詢數(shù)據(jù)的語法。

語法

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

參數(shù) -'dbconn'是用于連接到數(shù)據(jù)庫的連接的名稱。 'query'是用于從數(shù)據(jù)庫提取數(shù)據(jù)的查詢字符串。 ':sequence'默認(rèn)情況下從數(shù)據(jù)庫獲取的所有數(shù)據(jù)行,并作為序列返回。 然后可以對(duì)序列執(zhí)行必要的操作,以查看已提取了哪些數(shù)據(jù)。

返回值 -這將返回一個(gè)序列,它將具有來自查詢操作的數(shù)據(jù)行。

以下示例顯示如何連接到employee表并獲取表中行的first_name列。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "http://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是作為fetch操作結(jié)果返回的序列。

如果我們假設(shè)在我們的數(shù)據(jù)庫中只有一行包含first_name值為John,則以下將是上述程序的輸出。

(John)

插入數(shù)據(jù)

當(dāng)您要將記錄創(chuàng)建到數(shù)據(jù)庫表中時(shí)需要。 以下是使用Clojure可以插入數(shù)據(jù)的語法。 這是通過使用'insert!'函數(shù)完成的。

語法

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

參數(shù) - ':table_name'是需要插入的表的名稱。 '{:column_namen columnvalue}'是所有列名稱和值的映射,需要在表中作為一行添加。

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

以下示例顯示如何將記錄插入到testdb數(shù)據(jù)庫中的employee表中。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "http://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}))

如果現(xiàn)在檢查MySQL數(shù)據(jù)庫和employee表,您將看到上面的行將成功插入表中。

刪除數(shù)據(jù)

可以使用'delete!'函數(shù)從表中刪除行。 以下是如何執(zhí)行此操作的語法。

語法

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

參數(shù) -':table_name'是需要插入的表的名稱。 'condition'是用于確定需要從表中刪除哪一行的條件。

返回值 -這將返回刪除的行數(shù)。

以下示例顯示如何從testdb數(shù)據(jù)庫中的employee表中刪除記錄。 示例根據(jù)年齡等于30的條件從表中刪除一行。

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

如果您有一條記錄包含年齡等于30的行,則該行將被刪除。

更新數(shù)據(jù)

可以使用'update!'函數(shù)從表中更新行。 以下是如何執(zhí)行此操作的語法。

語法

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

參數(shù) - ':table_name'是需要插入的表的名稱。 'setcondition'是需要根據(jù)映射提到的更新的列。 'condition'是用于確定需要從表中刪除哪一行的條件。

返回值 -這將返回更新的行數(shù)。

以下示例顯示如何從testdb數(shù)據(jù)庫中的employee表中刪除記錄。 該示例根據(jù)年齡等于30的條件更新表中的行,并將收入值更新為40。

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

如果您有一條記錄,其中的行的年齡等于值30,那行將被更新,其中收入的值將設(shè)置為40。

事務(wù)

事務(wù)是確保數(shù)據(jù)一致性的機(jī)制。 事務(wù)具有以下四個(gè)屬性

  • 原子性 -事務(wù)完成或根本沒有任何事情發(fā)生。

  • 一致性 -事務(wù)必須以一致的狀態(tài)開始,并使系統(tǒng)保持一致狀態(tài)。

  • 隔離性 -事務(wù)的中間結(jié)果在當(dāng)前事務(wù)外部不可見。

  • 耐用性 -一旦事務(wù)提交,即使在系統(tǒng)故障后,影響仍然是持久的。

以下示例顯示如何在Clojure中實(shí)現(xiàn)事務(wù)。 任何需要在事務(wù)中執(zhí)行的操作都需要嵌入到'with-dbtransaction'子句中。

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "http://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])))

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)