Предположение: у вас уже есть как Clojure, так и MySQL, работающие на вашем компьютере.
Как вы заставляете их говорить?
Как подключиться к базе данных MySQL из Clojure?
Ответ 1
Предположение: у вас уже есть как Clojure, так и MySQL на вашей машине.
-
checkout и постройте 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
-
Определите URL-адрес соединения вашей базы данных MySQL
Например, если вы используете MySQL под MAMP, то URL-адрес, который будет использоваться в JDBC, будет выглядеть примерно так:
conn = DriverManager.getConnection ("jdbc:mysql://localhost:8889/db_name?user=root&password=root")
URL-адрес разбивается на следующие компоненты:
- протокол:
jdbc:
- subprotocol:
mysql
- db-host:
localhost
- db-port:
8889
- имя пользователя
- пароль
- протокол:
-
Сделайте это Clojure script, измените параметры подключения к базе данных в соответствии с вашим 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.
NB Этот код был адаптирован из аналогичного кода, написанного Марк Фолькманн, в доступ к базе данных Postgres из Clojure
Ответ 2
Это дружественный для лейн ответ, с большим руководством от этого блога Нурулла Аккая:
-
добавьте зависимости к вашему
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
, чтобы запустить его), либо в нормальном исходном коде
Ответ 3
По состоянию на 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
Ответ 4
Если вам нужен синтаксический сахар, вы можете попробовать Корму.
(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]')