CommonLisp에서 Caveman2와 SQLite3을 사용하여 데이터베이스 작업을 시도했습니다.

소개



Caveman2를 공부하자 기사를 써 보았습니다.
Caveman2에서 SQLite를 조작하고 CREATE TABLE/SELECT/INSERT INTO/UPDATE/DELETE를 실행하는 방법을 설명합니다.

Caveman2 스켈레톤 프로젝트의 디렉토리 / 파일 구성



이번 괴롭히는 파일은 이하의 ★마크가 붙어 있는 파일입니다.
cl-caveman2-todo
  ├── README.markdown
  ├── app.lisp
  ├── db
  │    ├── todolist.db  ★ テーブル作成後に生成されるファイル
  │    └── schema.sql
  ├── cl-caveman2-todo-test.asd
  ├── cl-caveman2-todo.asd
  ├── src
  │    ├── config.lisp  ★ SQLite3の設定関連
  │    ├── db.lisp
  │    ├── main.lisp
  │    ├── view.lisp
  │    └── web.lisp     ★ SQL文の実行処理関連
  ├── static
  │   └── css
  │        └── main.css
  ├── templates
  │   ├── _errors
  │   │     └── 404.html
  │   ├── index.html
  │   └── layouts
  │         └── default.html
  └── tests
        └── myapp.lisp

SQLite3 설정



다음 위치를 찾아서

src/config.lisp
(defconfig :common
   `(:databases ((:maindb :sqlite3 :database-name ":memory:"))))

다음과 같이 다시 씁니다.

src/config.lisp
(defconfig :common
    `(:databases ((:maindb :sqlite3 :database-name ,(merge-pathnames #P"db/todolist.db" *application-root*)))))

다양한 SQL 실행 처리



SQL을 실행하기 위한 각종 함수를 정의해 갑니다.

테이블 만들기



테이블을 만드는 함수입니다.
이 함수를 실행하면 db 디렉토리 아래에 todolist.db가 생성됩니다.

src/web.lisp
(defun create-table ()
  (with-connection (db)
    (execute
     (create-table (:tasks :if-not-exists t)
         ((id   :type 'integer :primary-key t :unique t :autoincrement t)
          (name :type 'text))))))

테이블 내용 표시



현재의 테이블 내용을 표준 출력한다.

src/web.lisp
(defun view-tasks ()
  (with-connection (db)
    (let ((result (retrieve-all (select (:*) (from :tasks)))))
      (dolist (n result)
        (format t "~{~A ~}~%" n)))))

데이터 삽입



테이블에 데이터를 삽입합니다.
인수에 삽입할 데이터를 넣습니다.

src/web.lisp
(defun insert-task (data)
  (with-connection (db)
    (execute
     (insert-into :tasks
       (set= :name data)))))

데이터 업데이트



지정된 ID의 데이터를 갱신합니다.
인수는 ID와 업데이트 후 데이터.

src/web.lisp
(defun update-task (id name)
  (with-connection (db)
    (execute
     (update :tasks
       (set= :name name)
       (where (:= :id id))))))

데이터 삭제



데이터를 삭제합니다.
인수로 삭제할 데이터의 ID를 지정합니다.

src/web.lisp
(defun delete-task (id)
  (with-connection (db)
    (execute
     (delete-from :tasks
       (where (:= :id id))))))

실행



다음 명령으로 실행

프로젝트 로드
(ql:quickload :cl-caveman2-todo)

테이블 만들기
(cl-caveman2-todo.web::create-table)

테이블 내용을 표시
(cl-caveman2-todo.web::view-tasks)

데이터 삽입
(cl-caveman2-todo.web::insert-task "データ")

데이터 업데이트
(cl-caveman2-todo.web::update-task 1 "データ")

데이터 삭제
(cl-caveman2-todo.web::delete-task 1)

이하, 실행중인 모습


create-table 함수 실행 후 db 디렉토리 아래에 있는 todolist.db에도 각종 SQL 실행 결과가 제대로 반영되어 있습니다.

[테이블 작성 전후]



[ 데이터 삽입 후 ]



[ 데이터 갱신 후 ]



[ 데이터 삭제 후 ]



마지막으로



처음 SQLite3을 사용했지만 간단하고 사용하기 쉽습니다.

후에는 브라우저로부터의 입력이나 브라우저에의 반영을 할 수 있으면 TODO리스트 어플리모드키를 만들 수 있을 것 같은 생각이 듭니다.

좋은 웹페이지 즐겨찾기