WebサーバーとDBとの連携(3)DBの接続と制御

人工知能技術 セマンティックウェブ技術 オントロジー技術 検索技術    データベース技術  デジタルトランスフォーメーション技術  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と接続し、複数のテーブルを生成、データを挿入して、検索までのコードサンプルを記述している。

次回は少し寄り道をして、データベース技術に関して述べてみたい。

コメント

  1. […] 前回と同様に、spacemacs上でREPLして、localhost:3000/にアクセスすると結果が見える。次回はデータベースの立ち上げと連携について述べる。 […]

  2. […] 前回少し寄り道をしてデータベースについて述べたが、今回はその前に述べていたWebサーバーとDBとの連携について書いてみたい。最終的なゴールとしては、クライアントでUIを構築(別途記載)、そこからHTTP経由でサーバーにアクセスし、さらにそのサーバーがリクエストを受けた情報に関してデータベースとやりとりするというイメージになる。さらに以前記述した機械学習結果をDBに入れることで人工知能系の検証実験を組める。 […]

  3. […] Clojureでデータベースにアクセスする際に、SQL等のクエリ文の一部を変数とするとフレキシブルなデータベースアクセスが実現できる。それを美しく実現するのが「format関数」だ。基本的な使い方としては以下のようなものとなる。 […]

  4. […] webサーバーとDBの連携(3) posgresqlのラッパー […]

  5. […] webサーバーとDBの連携(3) DBの接続と制御 […]

タイトルとURLをコピーしました