2009-03-05 42 views

Trả lời

29

Giả sử: bạn đã có cả Clojure và MySQL đang chạy trên máy của mình.

  1. kiểm tra và xây dựng clojure-contrib:

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

    Đặt kết quả clojure-contrib.jar trên bạn CLASSPATH.

  2. Tải MySQL Connector/J và đặt mysql-connector-java-5.1.7-bin.jar trên CLASSPATH của bạn

    Bạn có thể phải chạy JVM của bạn với những lập luận này:

    -Djdbc.drivers=com.mysql.jdbc.Driver 
    
  3. Xác định URL kết nối của cơ sở dữ liệu MySQL của bạn

    Ví dụ, nếu bạn đang chạy MySQL dưới MAMP thì URL mà bạn sẽ sử dụng trong JDBC sẽ giống như thế:

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

    Url được chia nhỏ thành các thành phần:

    • giao thức: jdbc:
    • subprotocol: mysql
    • db-host: localhost
    • db cổng: 8889
    • tên
    • mật khẩu
  4. Hãy kịch bản clojure này, sửa đổi các thông số kết nối cơ sở dữ liệu để phù hợp với URL của bạn, save as test.clj, biên dịch và chạy.

(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 Mã này đã được chuyển thể từ mã tương tự được viết bởi Mark Volkmann để access a Postgres database from Clojure

+2

Các bình luận (;;' bỏ qua) trên dòng đầu tiên không phải là một phần bắt buộc của mã nguồn - nó đã được thêm vào trước phục vụ màu cú pháp của nguồn Clojure. – devstopfix

+0

Bước 1 bây giờ là: git clone git: //github.com/richhickey/clojure-contrib.git –

+1

Lưu ý rằng có thể bạn sẽ không thể kết nối trực tiếp với máy chủ từ xa, vì vậy bạn nên chuyển sang cổng chuyển tiếp một số cổng cục bộ ngẫu nhiên tới máy chủ bằng một cái gì đó như 'ssh -L 1234: localhost: 3306 user @ remoteserver'. Ngoài ra, hãy kiểm tra GNU Screen để làm cho nó dễ dàng hơn để đối phó với nhiều thiết bị đầu cuối. – konr

15

Đây là một câu trả lời Lein thân thiện, với sự hướng dẫn nhiều từ this blog by Nurullah Akkaya:

  1. add phụ thuộc vào số 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 
    
    của bạn
  2. chạy lein deps từ dòng lệnh để lấy phụ thuộc

  3. xác định thông tin kết nối của bạn trong một bản đồ:

    user=> (use 'clojure.contrib.sql) 
    nil 
    user=> (def db {:classname "com.mysql.jdbc.Driver" 
           :subprotocol "mysql" 
           :subname "//localhost:3306/nmr" 
           :user "root"}) 
    
  4. sử dụng with-connectionwith-query-results macro (& others):

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

bước 3 & 4 có thể là từ repl (lein repl để bắt đầu nó) hoặc bên trong mã nguồn bình thường

+0

Cảm ơn! Bằng cách này, phiên bản "ổn định" mới nhất vào thời điểm này là 1.4.0 cho clojure, 0.2.3 cho java.jdbc và 5.1.22 cho mysql-connector-java. clojure-contrib không còn cần thiết nữa và clojure.contrib.sql bây giờ là một phần của java.jdbc. Xem https://github.com/clojure/java.jdbc để biết ví dụ. – raylu

4

Nếu bạn muốn có một số đường cú pháp, bạn có thể thử 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

Đó thực sự không phải là mysql. – Ven

+0

@Ven, Mặc dù 'defdb' trong đoạn mã trên thực sự trỏ tới Postgres, tài liệu này bao gồm MySql giữa các cơ sở dữ liệu khác. Xem tại đây: http://sqlkorma.com/docs#db Có thể đoạn mã có thể được cập nhật để có mối tương quan tốt hơn với câu hỏi. –

5

Tính đến 2016:

sử dụng Leiningen, thêm phụ thuộc bên project.clj:

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

yêu cầu kết nối cơ sở dữ liệu bên trong định nghĩa namespace:

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

xác định kết nối cơ sở dữ liệu:

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

truy vấn cơ sở dữ liệu:

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

tìm thêm ví dụ ở http://clojure-doc.org/articles/ecosystem/java_jdbc/using_sql.html

Các vấn đề liên quan