Giả sử: bạn đã có cả Clojure và MySQL đang chạy trên máy của bạn.
Bạn làm cho họ nói chuyện như thế nào?Làm cách nào để kết nối với cơ sở dữ liệu MySQL từ Clojure?
Trả lời
Giả sử: bạn đã có cả Clojure và MySQL đang chạy trên máy của mình.
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.
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
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
- giao thức:
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
Đâ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:
add phụ thuộc vào số
project.clj
:
của bạn(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
chạy
lein deps
từ dòng lệnh để lấy phụ thuộcxá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"})
sử dụng
with-connection
vàwith-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
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
Nếu bạn muốn có một số đường cú pháp, bạn có thể thử Korma.
(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]')
Đó thực sự không phải là mysql. – Ven
@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. –
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 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
Bước 1 bây giờ là: git clone git: //github.com/richhickey/clojure-contrib.git –
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