假设:您的计算机上已经运行了Clojure和MySQL 你怎么让他们说话?
答案 0 :(得分:29)
假设:您已经在计算机上运行了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")
网址分为以下几个部分:
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撰写的类似代码access a Postgres database from Clojure
答案 1 :(得分:15)
这是一个对莱恩友好的答案,得到this blog by 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
宏(& others):
user=> (with-connection db (with-query-results rs ["select * from sometable"] (count rs)))
667
第3步& 4可以来自repl(lein repl
启动它)或者是普通源代码
答案 2 :(得分:6)
截至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
答案 3 :(得分:4)
如果你想要一些语法糖,你可以试试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')