Clojure - bazy danych

Aby móc korzystać z funkcji bazy danych, najpierw pobierz plik jdbc files z następującego adresu URL - https://codeload.github.com/clojure/java.jdbc/zip/master

Znajdziesz plik zip, który zawiera niezbędne sterowniki dla Clojure, aby mieć możliwość łączenia się z bazami danych. Po rozpakowaniu pliku zip dodaj rozpakowaną lokalizację do ścieżki klas.

Głównym plikiem służącym do połączeń z bazą danych jest plik o nazwie jdbc.clj w lokalizacji clojure / java.

Łącznik clojure jdbc obsługuje wiele różnych baz danych, z których niektóre są następujące.

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

W naszym przykładzie użyjemy MySQL DB jako przykładu.

Następujące operacje są możliwe w Clojure w odniesieniu do baz danych.

Połączenie z bazą danych

Przed połączeniem się z bazą danych MySQL upewnij się, że:

  • Utworzyłeś bazę danych TESTDB.

  • Utworzyłeś tabelę PRACOWNIK w TESTDB.

  • Ta tabela zawiera pola FIRST_NAME, LAST_NAME, AGE, SEX i INCOME.

  • ID użytkownika „testuser” i hasło „test123” są ustawione na dostęp do bazy danych TESTDB.

  • Upewnij się, że pobrałeś „plik jar mysql” i dodałeś go do ścieżki klas.

  • Przeszedłeś przez samouczek MySQL, aby zrozumieć podstawy MySQL .

Składnia

Poniżej znajduje się składnia tworzenia połączenia w Clojure.

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

Parameters- „nazwa_połączenia” to nazwa, która ma być nadana połączeniu. Protokół podrzędny jest protokołem używanym do połączenia. Domyślnie będziemy używać protokołu mysql. „nazwa podrzędna” to adres URL połączenia z bazą danych mysql wraz z nazwą bazy danych. „user” to nazwa użytkownika używana do łączenia się z bazą danych. „hasło” to hasło używane do łączenia się z bazą danych.

Return Value - Zapewni to ciąg połączenia, którego można użyć w kolejnych operacjach mysql.

Poniższy przykład pokazuje, jak połączyć się z tabelami w schemacie informacji i pobrać wszystkie dane w tabeli.

Przykład

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

Zapytanie o dane

Zapytanie o dane w dowolnej bazie danych oznacza pobranie przydatnych informacji z bazy danych. Po ustanowieniu połączenia z bazą danych możesz wykonać zapytanie do tej bazy danych. Poniżej znajduje się składnia, za pomocą której można wyszukiwać dane za pomocą Clojure.

Składnia

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

Parameters- „dbconn” to nazwa połączenia używanego do łączenia się z bazą danych. „zapytanie” to ciąg zapytania używany do pobierania danych z bazy danych. „: sequence” to domyślnie wszystkie wiersze danych pobranych z bazy danych i zwracane jako sekwencja. Następnie można wykonać niezbędne operacje na sekwencji, aby zobaczyć, jakie dane zostały pobrane.

Return Value - Zwróci sekwencję, która będzie zawierała wiersze danych z operacji zapytania.

Poniższy przykład pokazuje, jak połączyć się z tabelą pracowników i pobrać kolumnę first_name z wierszy w tabeli.

Przykład

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

Z powyższego kodu możemy to zobaczyć

  • Zapytanie „wybierz imię od pracownika” jest przekazywane jako ciąg zapytania.

  • The: first_name to sekwencja, która jest zwracana w wyniku operacji pobierania.

Jeśli założymy, że w naszej bazie danych jest tylko jeden wiersz zawierający wartość imię_Jana, następujące dane będą wynikiem powyższego programu.

(John)

Wstawianie danych

Jest to wymagane, gdy chcesz utworzyć rekordy w tabeli bazy danych. Poniżej znajduje się składnia, za pomocą której można wstawiać dane za pomocą Clojure. Odbywa się to za pomocą‘insert!’ funkcjonować.

Składnia

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

Parameters- „: nazwa_tabeli” to nazwa tabeli, do której należy dokonać wstawienia. „{: column_namen columnvalue}” to mapa wszystkich nazw kolumn i wartości, które należy dodać jako wiersz w tabeli.

Return Value - Zwróci zero, jeśli wstawienie zakończy się pomyślnie.

Poniższy przykład pokazuje, jak wstawić rekord do tabeli pracowników w bazie danych testdb.

Przykład

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

Jeśli teraz sprawdzisz swoją bazę danych MySQL i tabelę pracowników, zobaczysz, że powyższy wiersz zostanie pomyślnie wstawiony do tabeli.

Usuwanie danych

Wiersze można usunąć z tabeli przy użyciu rozszerzenia ‘delete!’funkcjonować. Poniżej znajduje się składnia opisująca, jak można wykonać tę operację.

Składnia

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

Parameters- „: nazwa_tabeli” to nazwa tabeli, do której należy dokonać wstawienia. „warunek” to warunek służący do określenia, który wiersz należy usunąć z tabeli.

Return Value - Zwróci liczbę usuniętych wierszy.

Poniższy przykład pokazuje, jak usunąć rekord z tabeli pracowników w bazie danych testdb. Przykład usuwa wiersz z tabeli na podstawie warunku, że wiek jest równy 30.

Przykład

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

Jeśli miałeś rekord, który miał wiersz z wiekiem równym 30, ten wiersz zostanie usunięty.

Aktualizacja danych

Wiersze można aktualizować z tabeli przy użyciu rozszerzenia ‘update!’funkcjonować. Poniżej znajduje się składnia opisująca, jak można wykonać tę operację.

Składnia

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

Parameters- „: nazwa_tabeli” to nazwa tabeli, do której należy dokonać wstawienia. „setcondition” to kolumna, która wymaga aktualizacji zgodnie z mapą. „warunek” to warunek, który służy do określenia, który wiersz ma zostać usunięty z tabeli.

Return Value - Zwróci liczbę zaktualizowanych wierszy.

Poniższy przykład pokazuje, jak usunąć rekord z tabeli pracowników w bazie danych testdb. Przykład aktualizuje wiersz z tabeli na podstawie warunku, że wiek jest równy 30 i aktualizuje wartość dochodu do 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])))

Jeśli miałeś rekord, który miał wiersz z wiekiem równym 30, ten wiersz zostanie zaktualizowany, a wartość dochodu zostanie ustawiona na 40.

Transakcje

Transakcje to mechanizmy zapewniające spójność danych. Transakcje mają następujące cztery właściwości -

  • Atomicity - Albo transakcja zostaje zakończona, albo nic się nie dzieje.

  • Consistency - Transakcja musi rozpocząć się w stanie zgodnym i pozostawić system w stanie zgodnym.

  • Isolation - Pośrednie wyniki transakcji nie są widoczne poza bieżącą transakcją.

  • Durability - Po zatwierdzeniu transakcji efekty są trwałe, nawet po awarii systemu.

Przykład

Poniższy przykład pokazuje, jak implementować transakcje w Clojure. Wszelkie operacje, które muszą zostać wykonane w transakcji, muszą być osadzone w pliku‘with-dbtransaction’ klauzula.

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