人工知能技術 セマンティックウェブ技術 オントロジー技術 検索技術 データベース技術 デジタルトランスフォーメーション技術 Visualization & UX ワークフロー&サービス. プログラミング Clojure データベース技術
前回まででサーバーの立ち上げまでを行なった。今回はDBの立ち上げとClojureによる接続、制御を行う。
DBとして、まずはpostgresqlを対象とする。postgresqlは象がトレードマークのフリーでオープンな関係データベース管理システム(relational database management system:RDMS)である。
「関係データベース」とは「関係モデル」に基づいて構築されたもので、「関係モデル」はあらゆるデータは n 項の関係(リレーション)で表現されるという前提に基づくモデルとなる。(例:顧客(顧客ID、名前、住所、市、県、郵便番号、電話番号))。このRDMSのデータの操作や定義を行うためのデータベース言語(問い合わせ言語)がSQLと呼ばれる。
postgresqlのインストールの仕方は、公式ページからインストーラーをダウンロードしてインストールする方法や、macの場合はhomebrewを利用する方法等複数ある。ここではhomebrewを利用した方法について述べる。
基本的操作はターミナルで行う。以下のサンプルコードでpostgresqlのインストールから、postgresqlのスタート、データベースの作成と、データベースへのログイン、tableの作成とデータの挿入/検索までの一連の流れを示す。
#postgresqlをインストール
brew install postgresql
#postgresqlをスタート
brew services start postgresql
#psql(データベースやテーブルを作成したりデータの追加や取得をするためのコマンドラインベースツール)のログイン
psql postgres
#DB作成(データベース名my-dbをowner名postgresで生成)
create database my-db owner=postgres;
#作成したDBを確認
\l
#DB削除
Drop database my-db;
#終了
\q
#DBログイン
psql my-db -U postgres
#テーブル名と、テーブルの全ての列の名前と型を指定することで、新しいテーブルを作成する。
CREATE TABLE weather (
city varchar(80),
temp_lo int, -- 最低気温
temp_hi int, -- 最高気温
prcp real, -- 降水量
date date --日付
);
#テーブル確認
\d
#テーブル削除
DROP TABLE weather;
#データの挿入
INSERT INTO weather ( city, temp_lo, temp_hi) VAKUES (‘tokyo’, 5, 36);
#検索
SELECT city FROM weather;
#データの変更
UPDATE weather SET city ‘Osaka’ WHERE id =1 ;
#データの削除
DELETE FROM weather WHERE id = 1;
#終了
\q
#postgresqlストップ
brew services stop postgresql
上記の操作で例として、データベース”my-db”、テーブル”weather”を作成した。次にserverの立ち上げとDBとの接続、データのやり取りを示す。コードを実行する前に、前述のdb立ち上げを行う必要がある。(終了後は必ずposgresストップを行うこと)
以下にclojureのサンプルコードを示す。
(ns db-test01.core)
(require '[clojure.java.jdbc :as jdbc]
'[java-jdbc.ddl :as ddl]
'[compojure.core :refer [defroutes context GET POST]])
;;db設定
(def db-spec
{:dbtype "postgresql" :dbname "my-db" :host "localhost" :port 5432})
;;テーブル作成
(jdbc/db-do-commands db-spec
(ddl/create-table :member
[:id :serial]
[:name "varchar(20)" "not null"]
[:age :int]
[:address :varchar]))
;; dbへのデータ追加
(jdbc/insert! db-spec :member {:name "nobody"})
(jdbc/insert! db-spec :member {:name "mrbox"})
(jdbc/insert! db-spec :member {:name "alice" :address "wonderland"})
(jdbc/insert! db-spec :member {:name nil})
(jdbc/insert! db-spec :member [:name :address] ["cheshire" nil] ["mad hatter" nil])
;; dbからのデータ確認
(jdbc/query "postgresql://localhost:5432/my-db"
["select *from member"])
;; dbのデータ更新 idが1の年齢を24に変える
(jdbc/update! db-spec :member {:age 24} ["id = ?" 1])
;; データ取得(2)
(jdbc/query db-spec "select * from member")
(jdbc/query db-spec ["select * from member where id = ?" 1])
(jdbc/query db-spec ["select * from member where id = ?" 2])
;;テーブルの削除
(jdbc/db-do-commands db-spec (jdbc/drop-table-ddl :fruit))
(jdbc/db-do-commands db-spec (jdbc/drop-table-ddl :member))
(jdbc/query db-spec "select * from fruit")
(jdbc/db-do-commands db-spec
(ddl/create-table :fruit
[:name "varchar(16)" "PRIMARY KEY"]
[:appearance "varchar(32)"]
[:cost :int "NOT NULL"]
[:unit "varchar(16)"]
[:grade :real]))
(jdbc/insert! db-spec :fruit
nil ; column names omitted
["Red Delicious" "dark red" 20 "bushel" 8.2]
["Plantain" "mild spotting" 48 "stalk" 7.4]
["Kiwifruit" "fresh" 35 "crate" 9.1]
["Plum" "ripe" 12 "carton" 8.4])
上記のコードは、”db設定”で立ち上げたdbと接続し、複数のテーブルを生成、データを挿入して、検索までのコードサンプルを記述している。
次回は少し寄り道をして、データベース技術に関して述べてみたい。
コメント
[…] 前回と同様に、spacemacs上でREPLして、localhost:3000/にアクセスすると結果が見える。次回はデータベースの立ち上げと連携について述べる。 […]
[…] 前回少し寄り道をしてデータベースについて述べたが、今回はその前に述べていたWebサーバーとDBとの連携について書いてみたい。最終的なゴールとしては、クライアントでUIを構築(別途記載)、そこからHTTP経由でサーバーにアクセスし、さらにそのサーバーがリクエストを受けた情報に関してデータベースとやりとりするというイメージになる。さらに以前記述した機械学習結果をDBに入れることで人工知能系の検証実験を組める。 […]
[…] Clojureでデータベースにアクセスする際に、SQL等のクエリ文の一部を変数とするとフレキシブルなデータベースアクセスが実現できる。それを美しく実現するのが「format関数」だ。基本的な使い方としては以下のようなものとなる。 […]
[…] webサーバーとDBの連携(3) posgresqlのラッパー […]
[…] webサーバーとDBの連携(3) DBの接続と制御 […]