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