假设:您的机器上已经运行了 Clojure 和 MySQL。
你怎么让他们说话?
4 回答
假设:您的机器上已经运行了 Clojure 和 MySQL。
结帐并构建clojure-contrib:
git clone git://github.com/richhickey/clojure-contrib.git cd clojure-contrib build
将生成的clojure-contrib.jar放在CLASSPATH上。
下载MySQL Connector/J并将mysql-connector-java-5.1.7-bin.jar放在CLASSPATH上
您可能必须使用以下参数运行 JVM:
-Djdbc.drivers=com.mysql.jdbc.Driver
确定 MySQL 数据库的连接 URL
例如,如果您在MAMP下运行 MySQL, 那么您将在 JDBC 中使用的 URL 将类似于:
conn = DriverManager.getConnection ("jdbc:mysql://localhost:8889/db_name?user=root&password=root")
url 被分解为以下组件:
- 协议:
jdbc:
- 子协议:
mysql
- 数据库主机:
localhost
- 数据库端口:
8889
- 用户名
- 密码
- 协议:
制作这个clojure脚本,修改数据库连接参数以匹配你的URL,另存为test.clj,编译运行。
(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.
注意 此代码改编自 Mark Volkmann 编写的类似代码,用于从 Clojure 访问 Postgres 数据库
这是一个对 lein 友好的答案,在Nurullah Akkaya 的这篇博客中提供了很多指导:
将依赖项添加到您的
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
从命令行运行
lein deps
以获取依赖项在地图中指定您的连接信息:
user=> (use 'clojure.contrib.sql) nil user=> (def db {:classname "com.mysql.jdbc.Driver" :subprotocol "mysql" :subname "//localhost:3306/nmr" :user "root"})
使用
with-connection
和with-query-results
宏(及其他):user=> (with-connection db (with-query-results rs ["select * from sometable"] (count rs))) 667
第 3 步和第 4 步可以来自 repl(lein repl
启动它)或在普通源代码中
截至 2016 年:
使用Leiningen,在 project.clj 中添加依赖项:
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/java.jdbc "0.4.2"]
[mysql/mysql-connector-java "5.1.38"]]
在命名空间定义中需要数据库连接器:
(ns name.space
(:require [clojure.java.jdbc :as j]))
定义数据库连接:
(def db-map {:subprotocol "mysql"
:subname "//localhost:3306/SCHEME"
:user "DB_USER"
:password "DB_USER_PASS"})
查询数据库:
(j/query db-map ["SELECT * FROM table"])
在http://clojure-doc.org/articles/ecosystem/java_jdbc/using_sql.html找到更多示例
如果你想要一些语法糖,你可以试试 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 "chris@chris.com"))))
;; executes: SELECT * FROM users WHERE (users.usersname = 'chris' OR users.email = 'chris@chris.com')