2009-03-05 11 views

Respuesta

29

Hipótesis: ya tiene ambos Clojure y MySQL ejecutándose en su máquina.

  1. la caja y construir clojure-contrib:

    git clone git://github.com/richhickey/clojure-contrib.git 
    cd clojure-contrib 
    build 
    

    Ponga el resultado clojure-contrib.jar en su CLASSPATH.

  2. Descargar MySQL Connector/J y poner el mysql-connector-java-5.1.7-bin.jar en su CLASSPATH

    Puede que tenga que ejecutar la JVM con estos argumentos:

    -Djdbc.drivers=com.mysql.jdbc.Driver 
    
  3. determinar la URL de conexión de la base de datos MySQL

    Por ejemplo, si está ejecutando MySQL bajo MAMP continuación, la URL que usaría en JDBC se verá algo como:

    conn = DriverManager.getConnection 
         ("jdbc:mysql://localhost:8889/db_name?user=root&password=root") 
    

    La url se divide en los siguientes componentes:

    • protocolo: jdbc:
    • subprotocolo: mysql
    • db-host: localhost
    • db-puerto: 8889
    • nombre de usuario
    • contraseña
  4. Hacer este script clojure, modifique los parámetros de conexión de base de datos para que coincida con su URL, Guardar como test.clj, compilar y ejecutar.

(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 Este código fue adaptado de código similar escrito por Mark Volkmann a access a Postgres database from Clojure

+2

El comentario (;;' ignoran) en la primera línea no es una parte obligatoria del código fuente; se agregó a pre servir la coloración de sintaxis de la fuente de Clojure. – devstopfix

+0

El paso 1 es ahora: git clone git: //github.com/richhickey/clojure-contrib.git –

+1

Tenga en cuenta que probablemente no podrá conectarse directamente a un servidor remoto, por lo que podría ser una buena idea realizar un puerto. reenviar un puerto local aleatorio al servidor con algo como 'ssh -L 1234: localhost: 3306 user @ remoteserver'. Además, compruebe la pantalla GNU para que sea más fácil tratar con múltiples terminales. – konr

15

Esta es una respuesta Lein-amigable, con mucha orientación de this blog by Nurullah Akkaya:

  1. complemento dependencias a su 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. plazo lein deps desde la línea de comandos para agarrar las dependencias

  3. especificar la información de conexión en un mapa:

    user=> (use 'clojure.contrib.sql) 
    nil 
    user=> (def db {:classname "com.mysql.jdbc.Driver" 
           :subprotocol "mysql" 
           :subname "//localhost:3306/nmr" 
           :user "root"}) 
    
  4. uso with-connection y with-query-results macros (& others):

    user=> (with-connection db (with-query-results rs ["select * from sometable"] (count rs))) 
    667 
    

pasos 3 4 & pueden ser o bien a partir de la réplica (lein repl para iniciarlo) o en el código fuente normal

+0

¡Gracias! Por cierto, las últimas versiones "estables" en este momento son 1.4.0 para clojure, 0.2.3 para java.jdbc y 5.1.22 para mysql-connector-java. clojure-contrib ya no es necesario y clojure.contrib.sql ahora es parte de java.jdbc. Consulte https://github.com/clojure/java.jdbc para ver un ejemplo. – raylu

4

Si quieres un poco de azúcar sintáctica, puede intentar 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

Sin embargo, eso no es realmente de mysql. – Ven

+0

@Ven, mientras que el 'defdb' en el fragmento anterior señala a Postgres, la documentación cubre MySql entre otras bases de datos. Consulte aquí: http://sqlkorma.com/docs#db Quizás el fragmento de código se pueda actualizar para tener una mejor correlación con la pregunta. –

5

A partir de 2016:

usando Leiningen, agregar dependencias dentro project.clj:

:dependencies [[org.clojure/clojure "1.8.0"] 
       [org.clojure/java.jdbc "0.4.2"] 
       [mysql/mysql-connector-java "5.1.38"]] 

requieren conector de base de datos en el interior del espacio de nombres definición:

(ns name.space 
    (:require [clojure.java.jdbc :as j])) 

definir la conexión de base de datos:

(def db-map {:subprotocol "mysql" 
      :subname "//localhost:3306/SCHEME" 
      :user "DB_USER" 
      :password "DB_USER_PASS"}) 

consulta la base de datos:

(j/query db-map ["SELECT * FROM table"]) 

Ver más ejemplos en http://clojure-doc.org/articles/ecosystem/java_jdbc/using_sql.html

Cuestiones relacionadas