Clojure - Bases de données

Afin d'utiliser la fonctionnalité de base de données, assurez-vous de télécharger d'abord le jdbc files à partir de l'url suivante - https://codeload.github.com/clojure/java.jdbc/zip/master

Vous trouverez un fichier zip contenant les pilotes nécessaires pour que Clojure puisse se connecter aux bases de données. Une fois le fichier zip extrait, assurez-vous d'ajouter l'emplacement décompressé à votre chemin de classe.

Le fichier principal pour la connectivité de la base de données est un fichier appelé jdbc.clj à l'emplacement clojure / java.

Le connecteur clojure jdbc prend en charge une grande variété de bases de données, dont certaines sont les suivantes.

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

Dans notre exemple, nous allons utiliser MySQL DB comme exemple.

Les opérations suivantes sont possibles dans Clojure en ce qui concerne les bases de données.

Connexion à la base de données

Avant de vous connecter à une base de données MySQL, assurez-vous de ce qui suit -

  • Vous avez créé une base de données TESTDB.

  • Vous avez créé une table EMPLOYEE dans TESTDB.

  • Cette table contient les champs FIRST_NAME, LAST_NAME, AGE, SEX et INCOME.

  • L'ID utilisateur "testuser" et le mot de passe "test123" sont définis pour accéder à TESTDB.

  • Assurez-vous d'avoir téléchargé le 'fichier jar mysql' et ajouté le fichier à votre chemin de classe.

  • Vous avez parcouru le didacticiel MySQL pour comprendre les bases de MySQL .

Syntaxe

Voici la syntaxe pour créer une connexion dans Clojure.

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

Parameters- 'connection_name' est le nom à donner à la connexion. «subprotocol» est le protocole à utiliser pour la connexion. Par défaut, nous utiliserons le protocole mysql. 'subname' est l'url pour se connecter à la base de données mysql avec le nom de la base de données. «utilisateur» est le nom d'utilisateur utilisé pour se connecter à la base de données. «mot de passe» est le mot de passe à utiliser pour se connecter à la base de données.

Return Value - Cela fournira une chaîne de connexion, qui peut être utilisée dans les opérations mysql suivantes.

L'exemple suivant montre comment se connecter aux tables du schéma d'informations et récupérer toutes les données de la table.

Exemple

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

Interroger des données

Interroger des données sur n'importe quelle base de données signifie récupérer des informations utiles dans la base de données. Une fois la connexion à la base de données établie, vous êtes prêt à effectuer une requête dans cette base de données. Voici la syntaxe par laquelle les données peuvent être interrogées à l'aide de Clojure.

Syntaxe

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

Parameters- 'dbconn' est le nom de la connexion utilisée pour se connecter à la base de données. «query» est la chaîne de requête utilisée pour récupérer les données de la base de données. ': sequence' correspond par défaut à toutes les lignes de données extraites de la base de données et renvoyées sous forme de séquence. Les opérations nécessaires sur la séquence peuvent alors être effectuées pour voir quelles données ont été récupérées.

Return Value - Cela renverra une séquence, qui contiendra les lignes de données de l'opération de requête.

L'exemple suivant montre comment se connecter à la table employee et récupérer la colonne first_name des lignes de la table.

Exemple

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

À partir du code ci-dessus, nous pouvons voir que

  • La requête «sélectionner le prénom de l'employé» est transmise comme chaîne de requête.

  • Le: first_name est la séquence, qui est retournée à la suite de l'opération d'extraction.

Si nous supposons qu'il n'y a qu'une seule ligne dans notre base de données qui contient une valeur first_name de John, ce qui suit sera la sortie du programme ci-dessus.

(John)

Insérer des données

Il est nécessaire lorsque vous souhaitez créer vos enregistrements dans une table de base de données. Voici la syntaxe par laquelle les données peuvent être insérées à l'aide de Clojure. Cela se fait en utilisant le‘insert!’ fonction.

Syntaxe

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

Parameters- ': table_name' est le nom de la table dans laquelle l'insertion doit être faite. '{: column_namen columnvalue}' est une carte de tous les noms et valeurs de colonne, qui doivent être ajoutés sous forme de ligne dans le tableau.

Return Value - Cela renverra nul si l'insertion est réussie.

L'exemple suivant montre comment insérer un enregistrement dans la table employee de la base de données testdb.

Exemple

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

Si vous vérifiez maintenant votre base de données MySQL et la table des employés, vous verrez que la ligne ci-dessus sera insérée avec succès dans la table.

Suppression de données

Les lignes peuvent être supprimées d'une table à l'aide de la ‘delete!’fonction. Voici la syntaxe sur la façon dont cette opération peut être effectuée.

Syntaxe

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

Parameters- ': table_name' est le nom de la table dans laquelle l'insertion doit être faite. «condition» est la condition utilisée pour déterminer quelle ligne doit être supprimée de la table.

Return Value - Cela renverra le nombre de lignes supprimées.

L'exemple suivant montre comment supprimer un enregistrement de la table employee dans la base de données testdb. L'exemple supprime une ligne de la table en fonction de la condition selon laquelle l'âge est égal à 30.

Exemple

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

Si vous aviez un enregistrement qui avait une ligne avec un âge égal à la valeur de 30, cette ligne sera supprimée.

Mise à jour des données

Les lignes peuvent être mises à jour à partir d'une table en utilisant le ‘update!’fonction. Voici la syntaxe sur la façon dont cette opération peut être effectuée.

Syntaxe

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

Parameters- ': table_name' est le nom de la table dans laquelle l'insertion doit être faite. 'setcondition' est la colonne qui doit être mise à jour comme mentionné en termes de carte. «condition» est la condition utilisée pour déterminer quelle ligne doit être supprimée du tableau.

Return Value - Cela renverra le nombre de lignes mises à jour.

L'exemple suivant montre comment supprimer un enregistrement de la table employee dans la base de données testdb. L'exemple met à jour une ligne de la table en fonction de la condition selon laquelle l'âge est égal à 30 et met à jour la valeur du revenu à 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])))

Si vous aviez un enregistrement qui avait une ligne avec un âge égal à la valeur de 30, cette ligne sera mise à jour et la valeur du revenu sera fixée à 40.

Transactions

Les transactions sont des mécanismes qui garantissent la cohérence des données. Les transactions ont les quatre propriétés suivantes -

  • Atomicity - Soit une transaction se termine, soit rien ne se passe du tout.

  • Consistency - Une transaction doit démarrer dans un état cohérent et laisser le système dans un état cohérent.

  • Isolation - Les résultats intermédiaires d'une transaction ne sont pas visibles en dehors de la transaction en cours.

  • Durability - Une fois qu'une transaction a été validée, les effets sont persistants, même après une panne du système.

Exemple

L'exemple suivant montre comment implémenter des transactions dans Clojure. Toutes les opérations qui doivent être effectuées dans une transaction doivent être intégrées dans le‘with-dbtransaction’ clause.

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