Hypothèse: Clojure et MySQL fonctionnent déjà sur votre machine.
Comment les faites-vous parler?Comment me connecter à une base de données MySQL à partir de Clojure?
Répondre
Hypothèse: vous avez déjà Clojure et MySQL en cours d'exécution sur votre machine.
caisse et construire clojure-contrib:
git clone git://github.com/richhickey/clojure-contrib.git cd clojure-contrib build
Mettre le résultat clojure-contrib.jar sur votre CLASSPATH.
Télécharger MySQL Connector/J et mettre le mysql-connector-java-5.1.7-bin.jar sur votre CLASSPATH
Vous pourriez avoir à exécuter votre machine virtuelle Java avec ces arguments:
-Djdbc.drivers=com.mysql.jdbc.Driver
Déterminer l'URL de connexion de votre base de données MySQL
Par exemple, si vous utilisez MySQL sous MAMP l'URL que vous utiliserez dans JDBC ressemblera à quelque chose comme:
conn = DriverManager.getConnection ("jdbc:mysql://localhost:8889/db_name?user=root&password=root")
L'URL se décompose en ces composants:
- protocole:
jdbc:
- subprotocol:
mysql
- db-hôte:
localhost
- db port:
8889
- Nom d'utilisateur Mot de passe
- protocole:
Faire ce script Clojure, modifiez les paramètres de connexion de base de données pour correspondre à votre URL, enregistrez comme test.clj, compiler et exécuter.
(use 'clojure.contrib.sql) ;;' satisfy prettify
(let [db-host "localhost"
db-port 8889
db-name "db_name"]
(def db {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname (str "//" db-host ":" db-port "/" db-name)
:user "root"
:password "root"})
(with-connection db
(with-query-results rs ["select * from languages"]
(dorun (map #(println (:language :iso_code %)) rs)))))
; rs will be a sequence of maps,
; one for each record in the result set.
NB Ce code a été adapté à partir du code similaire écrit par Mark Volkmann à access a Postgres database from Clojure
C'est une réponse lein conviviale, avec beaucoup d'indications de this blog by Nurullah Akkaya:
add dépendances à votre
project.clj
:(defproject clojql "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"] [org.clojure/clojure-contrib "1.2.0"] ;; for clojure.contrib.sql [org.clojure/java.jdbc "0.0.6"] ;; jdbc [mysql/mysql-connector-java "5.1.6"]]) ;; mysql driver
course
lein deps
de la ligne de commande pour saisir les dépendancesindiquer vos informations de connexion sur une carte:
user=> (use 'clojure.contrib.sql) nil user=> (def db {:classname "com.mysql.jdbc.Driver" :subprotocol "mysql" :subname "//localhost:3306/nmr" :user "root"})
utilisation
with-connection
etwith-query-results
macros (& others):user=> (with-connection db (with-query-results rs ["select * from sometable"] (count rs))) 667
étapes 3 & 4 peuvent être soit de la rempl (lein repl
pour le lancer) ou dans le code source normale
Merci! A ce propos, les dernières versions "stables" sont à ce jour 1.4.0 pour clojure, 0.2.3 pour java.jdbc, et 5.1.22 pour mysql-connector-java. clojure-contrib n'est plus nécessaire et clojure.contrib.sql fait maintenant partie de java.jdbc. Voir https://github.com/clojure/java.jdbc pour un exemple. – raylu
Si vous voulez un peu de sucre syntaxique, vous pouvez essayer de Korma.
(use 'korma.db)
(defdb db (postgres {:db "mydb"
:user "user"
:password "dbpass"}))
(use 'korma.core)
(defentity users)
(select users)
;; executes: SELECT * FROM users
(select users
(where (or (= :usersname "chris")
(= :email "[email protected]"))))
;; executes: SELECT * FROM users WHERE (users.usersname = 'chris' OR users.email = '[email protected]')
Ce n'est pas vraiment mysql cependant. – Ven
@Ven, Alors que le 'defdb' de l'extrait ci-dessus pointe vers Postgres, la documentation couvre MySql parmi d'autres bases de données. Voir ici: http://sqlkorma.com/docs#db Peut-être que l'extrait de code peut être mis à jour pour avoir une meilleure corrélation avec la question. –
À partir de 2016:
utilisant Leiningen, ajouter des dépendances à l'intérieur project.clj:
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/java.jdbc "0.4.2"]
[mysql/mysql-connector-java "5.1.38"]]
nécessitent connecteur de base de données à l'intérieur de la définition d'espace de noms:
(ns name.space
(:require [clojure.java.jdbc :as j]))
définir la connexion de base de données:
(def db-map {:subprotocol "mysql"
:subname "//localhost:3306/SCHEME"
:user "DB_USER"
:password "DB_USER_PASS"})
requête la base de données:
(j/query db-map ["SELECT * FROM table"])
trouver d'autres exemples à http://clojure-doc.org/articles/ecosystem/java_jdbc/using_sql.html
Le commentaire (;; » Ignore) sur la première ligne n'est pas une partie obligatoire du code source - il a été ajouté à pré servir la coloration syntaxique de la source Clojure. – devstopfix
Étape 1 est maintenant: git clone git: //github.com/richhickey/clojure-contrib.git –
Notez que vous ne serez probablement pas en mesure de se connecter directement à un serveur distant, donc ce pourrait être une bonne idée de mettre en communication transférer un port local aléatoire vers le serveur avec quelque chose comme 'ssh -L 1234: localhost: 3306 utilisateur @ remoteserver'. Vérifiez également GNU Screen pour faciliter la gestion de plusieurs terminaux. – konr