Как мне подключиться к базе данных MySQL из Clojure? - PullRequest
28 голосов
/ 05 марта 2009

Предположение: на вашем компьютере уже запущены Clojure и MySQL.
Как вы заставляете их говорить?

Ответы [ 4 ]

29 голосов
/ 05 марта 2009

Предположение: на вашем компьютере уже запущены 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. Определите URL подключения вашей базы данных MySQL

    Например, если вы используете MySQL в MAMP , то URL, который вы будете использовать в JDBC, будет выглядеть примерно так:

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

    URL разбит на следующие компоненты:

    • протокол: jdbc:
    • подпротокол: mysql
    • db-host: localhost
    • db-порт: 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.

NB Этот код был адаптирован из аналогичного кода, написанного Марком Фолькманном, для доступа к базе данных Postgres из Clojure

15 голосов
/ 19 апреля 2012

Это удобный для ответа ответ, с большим количеством указаний от этого блога Нуруллы Аккая :

  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-connection и with-query-results макросы (и другие) :

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

шаги 3 и 4 могут быть либо из repl (lein repl запустить его), либо из обычного исходного кода

6 голосов
/ 10 февраля 2016

По состоянию на 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 / статьи / экосистема / java_jdbc / using_sql.html

4 голосов
/ 30 декабря 2013

Если вам нужен синтаксический сахар, попробуйте Korma.

Docs

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...