Clojure - Базы данных
Чтобы использовать функциональность базы данных, сначала загрузите jdbc files со следующего URL-адреса - https://codeload.github.com/clojure/java.jdbc/zip/master
Вы найдете zip-файл с необходимыми драйверами, чтобы Clojure могла подключаться к базам данных. После извлечения zip-файла убедитесь, что вы добавили разархивированное местоположение в путь к классам.
Основным файлом для подключения к базе данных является файл с именем 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.
Идентификатор пользователя testuser и пароль test123 установлены для доступа к TESTDB.
Убедитесь, что вы скачали файл mysql jar и добавили его в путь к классам.
Вы прошли обучение MySQL, чтобы понять основы MySQL .
Синтаксис
Ниже приведен синтаксис для создания соединения в Clojure.
(def connection_name {
:subprotocol “protocol_name”
:subname “Location of mysql DB”
:user “username” :password “password” })
Parameters- 'connection_name' - имя, которое будет присвоено соединению. «субпротокол» - это протокол, который будет использоваться для соединения. По умолчанию мы будем использовать протокол mysql. «subname» - это URL-адрес для подключения к mysql db вместе с именем базы данных. «пользователь» - это имя пользователя, используемое для подключения к базе данных. «пароль» - это пароль, который будет использоваться для подключения к базе данных.
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» - это имя соединения, используемое для подключения к базе данных. «запрос» - это строка запроса, используемая для выборки данных из базы данных. ': sequence' по умолчанию - это все строки данных, извлеченные из базы данных и возвращаемые как последовательность. Затем можно выполнить необходимые операции с последовательностью, чтобы увидеть, какие данные были получены.
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 - Это вернет nil, если вставка выполнена успешно.
В следующем примере показано, как вставить запись в таблицу сотрудников в базе данных 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' - это имя таблицы, в которую необходимо произвести вставку. «условие» - это условие, используемое для определения строки, которую необходимо удалить из таблицы.
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' - это столбец, который необходимо обновить, как указано в терминах карты. «условие» - это условие, которое используется для определения, какую строку необходимо удалить из таблицы.
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])))