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