2014-02-06 34 views
1

不知道爲什麼,當我嘗試下面的代碼從Clojure的MySQL數據庫上執行一個查詢我得到這個錯誤:Clojure中使用MySQL和Java

user=> (mysql.core/list-users) 

ClassNotFoundException mysql.core java.net.URLClassLoader$1.run (URLClassLoader.java:366) 

這裏是我的project.clj文件

(defproject mysql "0.1.0-SNAPSHOT" 
:description "FIXME: write description" 
:url "http://example.com/FIXME" 
:license {:name "Eclipse Public License" 
     :url "http://www.eclipse.org/legal/epl-v10.html"} 
:dependencies [ 
        [org.clojure/clojure "1.5.1"] 
        [org.clojure/java.jdbc "0.3.3"] 
        [mysql/mysql-connector-java "5.1.25"] 
        [postgresql/postgresql "8.4-702.jdbc4"] 
        [org.xerial/sqlite-jdbc "3.7.2"] 
        [java-jdbc/dsl "0.1.0"] 
]) 

這裏是我的core.clj文件

(ns mysql.core 
(:require [clojure.java.jdbc :as sql])) 

(def db {:classname "com.mysql.jdbc.Driver" 
    :subprotocol "mysql" 
    :subname "//localhost:3306/dummy" 
    :user "idf" 
    :password "pwd"}) 

(defn list-users [] 
    (sql/with-connection db 
    (sql/with-query-results rows 
    ["select * from user"] 
    (println rows)))) 

下面是一些作品(唯一的事情是你必須得到正確DEPS機智豪特項目文件):

$ mysql -u root 
    mysql> create database clojure_test; 
    grant all on clojure_test.* to [email protected] identified by "clojure_test」; 
    use clojure_test; 
    CREATE TABLE fruit (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20),  appearance VARCHAR(20), cost DECIMAL(13,2)); 

lein repl 
user=> (require '[clojure.java.jdbc :as j]) 
user=> (def mysql-db {:subprotocol "mysql" :subname "//127.0.0.1:3306/clojure_test" :user "clojure_test" :password "clojure_test"}) 
user=> (j/insert! mysql-db :fruit {:name "Apple" :appearance "rosy" :cost 24} {:name "Orange" :appearance "round" :cost 49}) 
user=> (j/query mysql-db ["select * from fruit where appearance = ?" "rosy"] :row-fn :cost) 

回答

4

看來你在REPL運行代碼,您需要更改命名空間和裝載文件:

1,通過(ns mysql.core)
2更改REPL的命名空間,運行(load-file path-to-file)

編輯:

另一種解決方案是在REPL到EXCUTE (use 'mysql.core),那麼你就可以運行你的代碼。

+0

我很抱歉我對Clojure很新。你是指在獲得用戶=>提示符後運行(ns mysql.core)?另外,我不明白第2步? – Ivan

+0

第2步意味着你需要將你的Clojure文件加載到上下文中,在你的例子中似乎運行'(load-file「src/mysql/core.clj」)'user' namespace' – llj098

+0

你也可以使用'(使用'mysql.core)',還編輯了答案 – llj098