2011-05-25 10 views
8

Estoy intentando acceder a una base de datos Postgres dentro de Clojure. He encontrado un montón de ejemplos de proyectos que utilizan DB, la creación de la base de datos de esta manera:Problema del controlador con PostgreSQL/Clojure

(def db 
    {:classname "org.postgresql.Driver" 
    :subprotocol "postgresql" 
    :subname "//localhost/testdb" 
    :username "postgres" 
    :password "postgres"}) 

estoy continuación, tratando de entonces acceder a la base de datos de esta manera:

(sql/with-connection db 
    (sql/with-query-results recs ["select * from asdf"] 
     (doseq [rec recs] 
      (println rec)))) 

Sin embargo, estoy recibiendo este error:

No suitable driver found for jdbc:postgresql://localhost/testdb 
    [Thrown class java.sql.SQLException] 

estoy asumiendo el problema es con :classname "org.postgresql.Driver", pero no estoy seguro de cuál es la solución. Me imagino que debo proporcionar este controlador, pero no estoy seguro de dónde conseguirlo o dónde ubicarlo. Hay una descarga disponible en postgresql.org - ¿Debo descargar eso? ¿O hay algo que pueda poner en mi configuración de proyecto para obtener lein para descargarlo como una dependencia? Una vez que lo tengo, ¿a dónde va?


Editar (en respuesta a @mtnygard): tengo esto en mi project.clj:

(defproject hello-www "1.0.0-SNAPSHOT" 
    :dependencies [[org.clojure/clojure "1.2.1"] 
        [postgresql/postgresql "8.4-702.jdbc4"] 
        ...] 

Mi versión es Postgres 8.4:

[/media/data/dev/clojure/hello-www (postgres *)]$ postgres --version 
postgres (PostgreSQL) 8.4.8 
+0

¿Ejecutó "lein deps" después de agregar postgresql a su project.clj? – mtnygard

+0

Además, ¿cómo está ejecutando el cuerpo principal de su proyecto? "lein deps" simplemente pone los frascos en lib /. Aún debe ejecutar su programa con un classpath configurado. "lein run" y "lein repl" establecerán su classpath, por ejemplo. – mtnygard

+0

¡Has encontrado el problema! He corrido 'lein deps', pero no había actualizado mi REPL. Reiniciar Swank me dio una conexión. ¡Gracias! – Topher

Respuesta

8

Estás en el camino correcto. La excepción indica que classpath no tiene org.postgresql.Driver en ninguna parte.

Comprobando jarvana.com, encontré this entry para un driver JDBC 4 de postgres. Hay otras versiones disponibles, dependiendo del resto de su entorno de tiempo de ejecución. Puede incluir esto editando su archivo project.clj para agregar esta dependencia:

(defproject xxxxxxx 
    ;;; other stuff 

    :dependencies [[org.clojure/clojure "1.2.0"] 
       [postgresql/postgresql "9.0-801.jdbc4"]] 
) 
+0

Ya tengo postgresql en mi project.clj - por favor vea mi respuesta actualizada. – Topher

+0

Para cualquier persona con el mismo problema, asegúrese de que lo anterior esté en project.clj. Luego, ejecuta 'lein deps'. Es posible que deba reiniciar su REPL si está en uno para asegurarse de que reciba la actualización. – Topher

Cuestiones relacionadas