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