30

假设:您的机器上已经运行了 Clojure 和 MySQL。
你怎么让他们说话?

4

4 回答 4

29

假设:您的机器上已经运行了 Clojure 和 MySQL。

  1. 结帐并构建clojure-contrib

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

    将生成的clojure-contrib.jar放在CLASSPATH上。

  2. 下载MySQL Connector/J并将mysql-connector-java-5.1.7-bin.jar放在CLASSPATH上

    您可能必须使用以下参数运行 JVM:

    -Djdbc.drivers=com.mysql.jdbc.Driver
    
  3. 确定 MySQL 数据库的连接 URL

    例如,如果您在MAMP下运行 MySQL, 那么您将在 JDBC 中使用的 URL 将类似于:

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

    url 被分解为以下组件:

    • 协议:jdbc:
    • 子协议:mysql
    • 数据库主机:localhost
    • 数据库端口:8889
    • 用户名
    • 密码
  4. 制作这个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 数据库

于 2009-03-05T08:07:38.810 回答
15

这是一个对 lein 友好的答案,在Nurullah Akkaya 的这篇博客中提供了很多指导:

  1. 将依赖项添加到您的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
    
  2. 从命令行运行lein deps以获取依赖项

  3. 在地图中指定您的连接信息:

    user=> (use 'clojure.contrib.sql)
    nil
    user=> (def db {:classname "com.mysql.jdbc.Driver" 
                    :subprotocol "mysql" 
                    :subname "//localhost:3306/nmr" 
                    :user "root"})
    
  4. 使用with-connectionwith-query-results(及其他)

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

第 3 步和第 4 步可以来自 repl(lein repl启动它)或在普通源代码中

于 2012-04-18T20:19:17.047 回答
8

截至 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找到更多示例

于 2016-02-10T13:55:16.840 回答
4

如果你想要一些语法糖,你可以试试 Korma。

文档

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 "chris@chris.com"))))
;; executes: SELECT * FROM users WHERE (users.usersname = 'chris' OR users.email = 'chris@chris.com')
于 2013-12-30T13:39:31.233 回答