Clojure - ฐานข้อมูล

ในการใช้ฟังก์ชันฐานข้อมูลโปรดดาวน์โหลดไฟล์ jdbc files จาก url ต่อไปนี้ - https://codeload.github.com/clojure/java.jdbc/zip/master

คุณจะพบไฟล์ zip ซึ่งมีไดรเวอร์ที่จำเป็นสำหรับ Clojure เพื่อให้มีความสามารถในการเชื่อมต่อกับฐานข้อมูล เมื่อแตกไฟล์ zip แล้วให้แน่ใจว่าได้เพิ่มตำแหน่งที่คลายซิปลงใน classpath ของคุณ

ไฟล์หลักสำหรับการเชื่อมต่อฐานข้อมูลคือไฟล์ที่เรียกว่า jdbc.clj ในตำแหน่ง clojure / java

ตัวเชื่อมต่อ clojure jdbc รองรับฐานข้อมูลที่หลากหลายซึ่งบางส่วนมีดังต่อไปนี้

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

ในตัวอย่างของเราเราจะใช้ MySQL DB เป็นตัวอย่าง

การดำเนินการต่อไปนี้เป็นไปได้ใน Clojure เกี่ยวกับฐานข้อมูล

การเชื่อมต่อฐานข้อมูล

ก่อนเชื่อมต่อกับฐานข้อมูล MySQL โปรดตรวจสอบสิ่งต่อไปนี้ -

  • คุณได้สร้างฐานข้อมูล TESTDB

  • คุณได้สร้างตาราง EMPLOYEE ใน TESTDB

  • ตารางนี้มีฟิลด์ FIRST_NAME, LAST_NAME, AGE, SEX และ INCOME

  • ID ผู้ใช้ "testuser" และรหัสผ่าน "test123" ถูกตั้งค่าให้เข้าถึง TESTDB

  • ตรวจสอบให้แน่ใจว่าคุณได้ดาวน์โหลด 'mysql jar file' และเพิ่มไฟล์ลงใน classpath ของคุณ

  • คุณได้ผ่าน MySQL กวดวิชาที่จะเข้าใจMySQL ข้อมูลพื้นฐานเกี่ยวกับ

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์สำหรับสร้างการเชื่อมต่อใน Clojure

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

Parameters- 'connection_name' คือชื่อที่กำหนดให้กับการเชื่อมต่อ 'subprotocol' คือโปรโตคอลที่จะใช้สำหรับการเชื่อมต่อ โดยค่าเริ่มต้นเราจะใช้โปรโตคอล mysql 'subname' คือ url สำหรับเชื่อมต่อกับ mysql db พร้อมกับชื่อฐานข้อมูล 'user' คือชื่อผู้ใช้ที่ใช้เชื่อมต่อกับฐานข้อมูล 'รหัสผ่าน' คือรหัสผ่านที่ใช้เชื่อมต่อกับฐานข้อมูล

Return Value - สิ่งนี้จะให้สตริงการเชื่อมต่อซึ่งสามารถใช้ในการดำเนินการ 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

Parameters- 'dbconn' คือชื่อของการเชื่อมต่อที่ใช้เชื่อมต่อกับฐานข้อมูล 'query' คือสตริงการสืบค้นที่ใช้ดึงข้อมูลจากฐานข้อมูล ': ลำดับ' เป็นค่าเริ่มต้นแถวของข้อมูลทั้งหมดที่ดึงมาจากฐานข้อมูลและจะส่งคืนเป็นลำดับ จากนั้นการดำเนินการที่จำเป็นในลำดับสามารถทำได้เพื่อดูว่ามีการดึงข้อมูลใดบ้าง

Return Value - สิ่งนี้จะส่งคืนลำดับซึ่งจะมีแถวของข้อมูลจากการดำเนินการสืบค้น

ตัวอย่างต่อไปนี้แสดงวิธีการเชื่อมต่อกับตารางพนักงานและดึงข้อมูลคอลัมน์ 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 ต่อไปนี้จะเป็นผลลัพธ์ของโปรแกรมด้านบน

(John)

การแทรกข้อมูล

จำเป็นเมื่อคุณต้องการสร้างระเบียนของคุณลงในตารางฐานข้อมูล ต่อไปนี้เป็นไวยากรณ์ที่สามารถแทรกข้อมูลโดยใช้ Clojure ซึ่งทำได้โดยใช้ไฟล์‘insert!’ ฟังก์ชัน

ไวยากรณ์

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

Parameters- ': table_name' คือชื่อของตารางที่จะต้องทำการแทรก '{: column_namen columnvalue}' คือแผนผังของชื่อคอลัมน์และค่าทั้งหมดซึ่งจำเป็นต้องเพิ่มเป็นแถวในตาราง

Return Value - สิ่งนี้จะคืนค่าศูนย์หากการแทรกทำได้สำเร็จ

ตัวอย่างต่อไปนี้แสดงวิธีการแทรกระเบียนลงในตารางพนักงานในฐานข้อมูล 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]

Parameters- ': table_name' คือชื่อของตารางที่จะต้องทำการแทรก 'condition' คือเงื่อนไขที่ใช้ในการกำหนดว่าจะต้องลบแถวใดออกจากตาราง

Return Value - จะส่งคืนจำนวนแถวที่ถูกลบ

ตัวอย่างต่อไปนี้แสดงวิธีการลบเรกคอร์ดจากตารางพนักงานในฐานข้อมูล testdb ตัวอย่างจะลบแถวออกจากตารางตามเงื่อนไขว่าอายุเท่ากับ 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]

Parameters- ': table_name' คือชื่อของตารางที่จะต้องทำการแทรก 'setcondition' คือคอลัมน์ที่ต้องได้รับการอัปเดตตามที่กล่าวไว้ในแง่ของแผนที่ 'condition' คือเงื่อนไขที่ใช้ในการกำหนดว่าจะต้องลบแถวใดออกจากตาราง

Return Value - จะส่งคืนจำนวนแถวที่อัปเดต

ตัวอย่างต่อไปนี้แสดงวิธีการลบเรกคอร์ดจากตารางพนักงานในฐานข้อมูล testdb ตัวอย่างจะอัปเดตแถวจากตารางตามเงื่อนไขว่าอายุเท่ากับ 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

ธุรกรรม

ธุรกรรมเป็นกลไกที่ทำให้ข้อมูลมีความสอดคล้องกัน ธุรกรรมมีคุณสมบัติสี่ประการดังต่อไปนี้ -

  • Atomicity - ไม่ว่าธุรกรรมจะเสร็จสมบูรณ์หรือไม่มีอะไรเกิดขึ้นเลย

  • Consistency - ธุรกรรมต้องเริ่มต้นในสถานะที่สอดคล้องกันและปล่อยให้ระบบอยู่ในสถานะที่สอดคล้องกัน

  • Isolation - ผลลัพธ์ระดับกลางของธุรกรรมจะไม่ปรากฏนอกธุรกรรมปัจจุบัน

  • Durability - เมื่อมีการทำธุรกรรมแล้วผลกระทบจะคงอยู่แม้ระบบจะล้มเหลวก็ตาม

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีใช้ธุรกรรมใน 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])))