Clojure-데이터베이스

데이터베이스 기능을 사용하려면 먼저 jdbc files 다음 URL에서- https://codeload.github.com/clojure/java.jdbc/zip/master

Clojure가 데이터베이스에 연결하는 데 필요한 드라이버가있는 zip 파일을 찾을 수 있습니다. zip 파일의 압축이 풀리면 압축이 풀린 위치를 클래스 경로에 추가해야합니다.

데이터베이스 연결을위한 기본 파일은 다음과 같은 파일입니다. jdbc.clj clojure / java 위치에 있습니다.

clojure jdbc 커넥터는 다음과 같은 다양한 데이터베이스를 지원합니다.

  • H2Database
  • Oracle
  • 마이크로 소프트 SQL 서버
  • MySQL
  • PostgreSQL

이 예에서는 MySQL DB를 예로 사용하겠습니다.

Clojure에서 데이터베이스와 관련하여 다음 작업이 가능합니다.

데이터베이스 연결

MySQL 데이터베이스에 연결하기 전에 다음을 확인하십시오.

  • TESTDB 데이터베이스를 만들었습니다.

  • TESTDB에 EMPLOYEE 테이블을 작성했습니다.

  • 이 테이블에는 FIRST_NAME, LAST_NAME, AGE, SEX 및 INCOME 필드가 있습니다.

  • 사용자 ID "testuser"및 비밀번호 "test123"은 TESTDB에 액세스하도록 설정됩니다.

  • 'mysql jar 파일'을 다운로드하고 파일을 클래스 경로에 추가했는지 확인하십시오.

  • MySQL 튜토리얼을 통해 MySQL 기본 사항 을 이해했습니다 .

통사론

다음은 Clojure에서 연결을 만드는 구문입니다.

(def connection_name {
   :subprotocol “protocol_name”
   :subname “Location of mysql DB”
   :user “username” :password “password” })

Parameters− 'connection_name'은 연결에 부여 할 이름입니다. 'subprotocol'은 연결에 사용할 프로토콜입니다. 기본적으로 mysql 프로토콜을 사용합니다. 'subname'은 데이터베이스 이름과 함께 mysql db에 연결하는 URL입니다. 'user'는 데이터베이스에 연결하는 데 사용되는 사용자 이름입니다. 'password'는 데이터베이스에 연결하는 데 사용할 암호입니다.

Return Value − 이는 후속 mysql 작업에서 사용할 수있는 연결 문자열을 제공합니다.

다음 예는 정보 스키마의 테이블에 연결하고 테이블의 모든 데이터를 검색하는 방법을 보여줍니다.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/information_schema"
      :user "root"
      :password "shakinstev"})
   (println (sql/query mysql-db
      ["select table_name from tables"]
      :row-fn :table_name)))

데이터 쿼리

모든 데이터베이스에서 데이터를 쿼리한다는 것은 데이터베이스에서 유용한 정보를 가져 오는 것을 의미합니다. 데이터베이스 연결이 설정되면이 데이터베이스에 쿼리를 작성할 준비가 된 것입니다. 다음은 Clojure를 사용하여 데이터를 쿼리 할 수있는 구문입니다.

통사론

clojure.java.jdbc/query dbconn
["query"]
   :row-fn :sequence

Parameters− 'dbconn'은 데이터베이스에 연결하는 데 사용되는 연결 이름입니다. 'query'는 데이터베이스에서 데이터를 가져 오는 데 사용되는 쿼리 문자열입니다. ': sequence'는 기본적으로 데이터베이스에서 가져온 데이터의 모든 행이며 시퀀스로 반환됩니다. 그런 다음 시퀀스에서 필요한 작업을 수행하여 가져온 데이터를 확인할 수 있습니다.

Return Value − 이것은 쿼리 작업의 데이터 행을 포함하는 시퀀스를 반환합니다.

다음 예는 employee 테이블에 연결하고 테이블 행의 first_name 열을 가져 오는 방법을 보여줍니다.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/query mysql-db
      ["select first_name from employee"]
      :row-fn :first_name)))

위의 코드에서 우리는

  • “select first_name from employee”쿼리가 쿼리 문자열로 전달됩니다.

  • : first_name은 가져 오기 작업의 결과로 반환되는 시퀀스입니다.

John의 first_name 값을 포함하는 데이터베이스에 행이 하나만 있다고 가정하면 위 프로그램의 출력은 다음과 같습니다.

(John)

데이터 삽입

데이터베이스 테이블에 레코드를 만들 때 필요합니다. 다음은 Clojure를 사용하여 데이터를 삽입 할 수있는 구문입니다. 이것은‘insert!’ 함수.

통사론

clojure.java.jdbc/insert!
   :table_name {:column_namen columnvalue}

Parameters− ': table_name'은 삽입이 필요한 테이블의 이름입니다. '{: column_namen columnvalue}'는 테이블의 행으로 추가해야하는 모든 열 이름과 값의 맵입니다.

Return Value − 성공적으로 삽입되면 nil을 반환합니다.

다음 예제는 testdb 데이터베이스의 employee 테이블에 레코드를 삽입하는 방법을 보여줍니다.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (sql/insert! mysql-db
      :employee {:first_name "John" :last_name "Mark" :sex "M" :age 30 :income 30}))

이제 MySQL 데이터베이스와 직원 테이블을 확인하면 위의 행이 테이블에 성공적으로 삽입되는 것을 볼 수 있습니다.

데이터 삭제

다음을 사용하여 테이블에서 행을 삭제할 수 있습니다. ‘delete!’함수. 다음은이 작업을 수행 할 수있는 방법에 대한 구문입니다.

통사론

clojure.java.jdbc/delete!
   :table_name [condition]

Parameters− ': table_name'은 삽입이 필요한 테이블의 이름입니다. 'condition'은 테이블에서 삭제해야하는 행을 결정하는 데 사용되는 조건입니다.

Return Value − 삭제 된 행 수를 반환합니다.

다음 예제는 testdb 데이터베이스의 employee 테이블에서 레코드를 삭제하는 방법을 보여줍니다. 이 예에서는 연령이 30이라는 조건에 따라 테이블에서 행을 삭제합니다.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/delete! mysql-db
      :employee ["age = ? " 30])))

기간이 30 인 행이있는 레코드가있는 경우 해당 행이 삭제됩니다.

데이터 업데이트

다음을 사용하여 테이블에서 행을 업데이트 할 수 있습니다. ‘update!’함수. 다음은이 작업을 수행 할 수있는 방법에 대한 구문입니다.

통사론

clojure.java.jdbc/update!
   :table_name
{setcondition}
[condition]

Parameters− ': table_name'은 삽입이 필요한 테이블의 이름입니다. 'setcondition'은 맵에서 언급 한대로 업데이트해야하는 열입니다. '조건'은 테이블에서 삭제해야하는 행을 결정하는 데 사용되는 조건입니다.

Return Value − 업데이트 된 행 수를 반환합니다.

다음 예제는 testdb 데이터베이스의 employee 테이블에서 레코드를 삭제하는 방법을 보여줍니다. 이 예에서는 연령이 30 세라는 조건을 기반으로 테이블의 행을 업데이트하고 소득 값을 40으로 업데이트합니다.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (println (sql/update! mysql-db
      :employee
      {:income 40}
      ["age = ? " 30])))

나이가 30 인 행이있는 레코드가있는 경우 해당 행이 업데이트되고 소득 값이 40으로 설정됩니다.

업무

트랜잭션은 데이터 일관성을 보장하는 메커니즘입니다. 거래에는 다음과 같은 네 가지 속성이 있습니다.

  • Atomicity − 거래가 완료되거나 아무 일도 일어나지 않습니다.

  • Consistency − 트랜잭션은 일관된 상태에서 시작하고 시스템을 일관된 상태로 유지해야합니다.

  • Isolation − 거래의 중간 결과는 현재 거래 외부에서 볼 수 없습니다.

  • Durability − 일단 트랜잭션이 커밋되면 시스템 장애 후에도 효과가 지속됩니다.

다음 예제는 Clojure에서 트랜잭션을 구현하는 방법을 보여줍니다. 트랜잭션에서 수행해야하는 모든 작업은‘with-dbtransaction’ 절.

(ns test.core
   (:require [clojure.java.jdbc :as sql]))
(defn -main []
   (def mysql-db {
      :subprotocol "mysql"
      :subname "//127.0.0.1:3306/testdb"
      :user "root"
      :password "shakinstev"})
   (sql/with-db-transaction [t-con mysql-db]
      (sql/update! t-con
         :employee
         {:income 40}
         ["age = ? " 30])))