2009-03-05 6 views

Répondre

29

Hypothèse: vous avez déjà Clojure et MySQL en cours d'exécution sur votre machine.

  1. 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.

  2. 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 
    
  3. 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
  4. 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

+2

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

+0

Étape 1 est maintenant: git clone git: //github.com/richhickey/clojure-contrib.git –

+1

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

15

C'est une réponse lein conviviale, avec beaucoup d'indications de this blog by Nurullah Akkaya:

  1. 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 
    
  2. course lein deps de la ligne de commande pour saisir les dépendances

  3. indiquer 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"}) 
    
  4. utilisation with-connection et with-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

+0

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

4

Si vous voulez un peu de sucre syntaxique, vous pouvez essayer de Korma.

Docs

Github

(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]') 
+0

Ce n'est pas vraiment mysql cependant. – Ven

+0

@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. –

5

À 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

Questions connexes