Clojure - Cơ sở dữ liệu

Để sử dụng chức năng cơ sở dữ liệu, trước tiên hãy đảm bảo tải xuống jdbc files từ url sau - https://codeload.github.com/clojure/java.jdbc/zip/master

Bạn sẽ tìm thấy một tệp zip có các trình điều khiển cần thiết để Clojure có khả năng kết nối với cơ sở dữ liệu. Sau khi tệp zip được giải nén, hãy đảm bảo thêm vị trí đã giải nén vào classpath của bạn.

Tệp chính để kết nối cơ sở dữ liệu là tệp có tên jdbc.clj trong vị trí clojure / java.

Trình kết nối jdbc clojure hỗ trợ nhiều loại cơ sở dữ liệu, một số cơ sở dữ liệu sau.

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

Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng MySQL DB làm ví dụ.

Các thao tác sau có thể thực hiện được trong Clojure liên quan đến Cơ sở dữ liệu.

Kết nối cơ sở dữ liệu

Trước khi kết nối với cơ sở dữ liệu MySQL, hãy đảm bảo những điều sau:

  • Bạn đã tạo một cơ sở dữ liệu TESTDB.

  • Bạn đã tạo một bảng EMPLOYEE trong TESTDB.

  • Bảng này có các trường FIRST_NAME, LAST_NAME, AGE, SEX và THU NHẬP.

  • ID người dùng "testuser" và mật khẩu "test123" được đặt để truy cập TESTDB.

  • Đảm bảo bạn đã tải xuống 'tệp jar mysql' và thêm tệp vào classpath của bạn.

  • Bạn đã xem qua hướng dẫn MySQL để hiểu Cơ bản về MySQL .

Cú pháp

Sau đây là cú pháp để tạo kết nối trong Clojure.

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

Parameters- 'connection_name' là tên được đặt cho kết nối. 'subprotocol' là giao thức được sử dụng cho kết nối. Theo mặc định, chúng tôi sẽ sử dụng giao thức mysql. 'subname' là url để kết nối với db mysql cùng với tên cơ sở dữ liệu. 'user' là tên người dùng được sử dụng để kết nối với cơ sở dữ liệu. 'password' là mật khẩu được sử dụng để kết nối với cơ sở dữ liệu.

Return Value - Điều này sẽ cung cấp một chuỗi kết nối, có thể được sử dụng trong các hoạt động mysql tiếp theo.

Ví dụ sau cho thấy cách kết nối với các bảng trong lược đồ thông tin và truy xuất tất cả dữ liệu trong bảng.

Thí dụ

(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)))

Truy vấn dữ liệu

Truy vấn dữ liệu trên bất kỳ cơ sở dữ liệu nào có nghĩa là lấy một số thông tin hữu ích từ cơ sở dữ liệu. Khi kết nối cơ sở dữ liệu được thiết lập, bạn đã sẵn sàng thực hiện truy vấn vào cơ sở dữ liệu này. Sau đây là cú pháp mà dữ liệu có thể được truy vấn bằng cách sử dụng Clojure.

Cú pháp

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

Parameters- 'dbconn' là tên của kết nối được sử dụng để kết nối với cơ sở dữ liệu. 'query' là chuỗi truy vấn được sử dụng để tìm nạp dữ liệu từ cơ sở dữ liệu. ': sequin' theo mặc định là tất cả các hàng dữ liệu được lấy từ cơ sở dữ liệu và được trả về dưới dạng một chuỗi. Các thao tác cần thiết trên chuỗi sau đó có thể được thực hiện để xem dữ liệu nào đã được tìm nạp.

Return Value - Thao tác này sẽ trả về một chuỗi, trong đó sẽ có các hàng dữ liệu từ hoạt động truy vấn.

Ví dụ sau đây cho thấy cách kết nối với bảng nhân viên và tìm nạp cột first_name của các hàng trong bảng.

Thí dụ

(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)))

Từ đoạn mã trên, chúng ta có thể thấy rằng

  • Truy vấn “select first_name từ nhân viên” được chuyển dưới dạng chuỗi truy vấn.

  • : First_name là chuỗi, được trả về là kết quả của hoạt động tìm nạp.

Nếu chúng ta giả sử rằng chỉ có một hàng trong cơ sở dữ liệu của chúng ta chứa giá trị first_name của John, thì sau đây sẽ là đầu ra của chương trình trên.

(John)

Chèn dữ liệu

Nó được yêu cầu khi bạn muốn tạo bản ghi của mình vào một bảng cơ sở dữ liệu. Sau đây là cú pháp mà dữ liệu có thể được chèn bằng Clojure. Điều này được thực hiện bằng cách sử dụng‘insert!’ chức năng.

Cú pháp

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

Parameters- ': table_name' là tên của bảng cần thực hiện chèn. '{: column_namen columnvalue}' là một bản đồ của tất cả các tên và giá trị cột, những giá trị này cần được thêm vào dưới dạng một hàng trong bảng.

Return Value - Điều này sẽ trả về nil nếu việc chèn được thực hiện thành công.

Ví dụ sau đây cho thấy cách chèn một bản ghi vào bảng nhân viên trong cơ sở dữ liệu testdb.

Thí dụ

(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}))

Nếu bây giờ bạn kiểm tra cơ sở dữ liệu MySQL của mình và bảng nhân viên, bạn sẽ thấy rằng hàng trên sẽ được chèn thành công vào bảng.

Xóa dữ liệu

Có thể xóa hàng khỏi bảng bằng cách sử dụng ‘delete!’chức năng. Sau đây là cú pháp về cách hoạt động này có thể được thực hiện.

Cú pháp

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

Parameters- ': table_name' là tên của bảng cần thực hiện chèn. 'condition' là điều kiện được sử dụng để xác định hàng nào cần được xóa khỏi bảng.

Return Value - Thao tác này sẽ trả về số hàng đã bị xóa.

Ví dụ sau đây cho thấy cách xóa bản ghi khỏi bảng nhân viên trong cơ sở dữ liệu testdb. Ví dụ xóa một hàng khỏi bảng dựa trên điều kiện tuổi bằng 30.

Thí dụ

(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])))

Nếu bạn có một bản ghi có một hàng có tuổi bằng giá trị 30, thì hàng đó sẽ bị xóa.

Cập nhật dữ liệu

Hàng có thể được cập nhật từ bảng bằng cách sử dụng ‘update!’chức năng. Sau đây là cú pháp về cách hoạt động này có thể được thực hiện.

Cú pháp

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

Parameters- ': table_name' là tên của bảng cần thực hiện chèn. 'setcondition' là cột cần được cập nhật như đã đề cập về bản đồ. 'condition' là điều kiện được sử dụng để xác định hàng nào cần được xóa khỏi bảng.

Return Value - Điều này sẽ trả về số lượng hàng được cập nhật.

Ví dụ sau cho thấy cách xóa bản ghi khỏi bảng nhân viên trong cơ sở dữ liệu testdb. Ví dụ cập nhật một hàng từ bảng dựa trên điều kiện tuổi bằng 30 và cập nhật giá trị thu nhập thành 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])))

Nếu bạn có bản ghi có một hàng có tuổi bằng giá trị 30, hàng đó sẽ được cập nhật, trong đó giá trị thu nhập sẽ được đặt thành 40.

Giao dịch

Giao dịch là cơ chế đảm bảo tính nhất quán của dữ liệu. Các giao dịch có bốn thuộc tính sau:

  • Atomicity - Giao dịch hoàn tất hoặc không có gì xảy ra.

  • Consistency - Một giao dịch phải bắt đầu ở trạng thái nhất quán và để hệ thống ở trạng thái nhất quán.

  • Isolation - Kết quả trung gian của một giao dịch không được hiển thị bên ngoài giao dịch hiện tại.

  • Durability - Sau khi giao dịch được cam kết, các tác động sẽ tồn tại dai dẳng, ngay cả sau khi hệ thống bị lỗi.

Thí dụ

Ví dụ sau đây cho thấy cách thực hiện các giao dịch trong Clojure. Bất kỳ hoạt động nào cần được thực hiện trong một giao dịch cần phải được nhúng vào‘with-dbtransaction’ mệnh đề.

(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])))