さて、前回の続き。 前回はCavemanをインストールして、アプリケーションのskeltonを作成し、動作を確認するまでをやりました。
CavemanはFrameworkであり、ClackはMiddlewareなのを最初に整理しておくと、CavemanはRailsでありSinatraで、Clackは名前からもわかるかと思いますがRackと同じ位置付けということになります。
まずはプロジェクトskeltonの構成。
$ ls -l
total 32
-rw-r--r-- 1 hiyosi staff 36 8 21 23:35 README.markdown
-rw-r--r-- 1 hiyosi staff 55 8 21 23:35 README.org
drwxr-xr-x 3 hiyosi staff 102 8 21 23:35 config
drwxr-xr-x 3 hiyosi staff 102 8 21 23:30 lib
drwxr-xr-x 2 hiyosi staff 68 8 21 23:30 log
-rw-r--r-- 1 hiyosi staff 397 8 21 23:35 myapp-test.asd
-rw-r--r-- 1 hiyosi staff 1335 8 21 23:35 myapp.asd
drwxr-xr-x 5 hiyosi staff 170 8 21 23:35 src
drwxr-xr-x 3 hiyosi staff 102 8 21 23:30 static
drwxr-xr-x 3 hiyosi staff 102 8 21 23:35 t
drwxr-xr-x 3 hiyosi staff 102 8 21 23:35 templates
さらっと中身を確認してみると
- config/
- サーバの環境毎の設定ファイルが配置されている
- lib/
- 名前の通りプロジェクトで使うライブラリを置く。
- 初期ではemb.lispが配置されている
- log/
- その名の通りログ出力先ディレクトリ
- config/dev.lisp ファイルにて出力先は変更できる
- src/
- 実際のアプリケーションコードを配置する。
- 初期ではapp,controller,myapp.lispが配置されている
- static/
- 静的ファイルの置き場所(html,jsなど)
- t/
- テストコードの置き場所
- templates/
- ページのテンプレート。view的な位置づけかな
今はこれ以上深くはわからないので、書きながら覚えていきます。 あと、テンプレートエンジンの書き方も覚える必要があります。
自分はまだcl-embがわからないので、今回はとりあえずAPI的なものを実装してみます。 せっかくなのでDBにも繋いじゃいます。DBはとりあえずMySQLかな。
$ brew install mysql
$ mysql.server start
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.10 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
今回はちょこっと使いたいだけなので、設定とか特にしない。 続いてサンプルデータの投入。
$ curl -O http://downloads.mysql.com/docs/world_innodb.sql.gz
$ gunzip world_innodb.sql.gz
$ sudo mysqladmin create world
$ sudo mysql world < world_innodb.sql
$ mysql -u root
mysql> grant select , insert, update , delete , drop , create on world.* to myapp@'localhost' identified by '<パスワード>';
mysql> exit
$ mysql -u myapp -p -D world
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| City |
| Country |
| CountryLanguage |
+-----------------+
3 rows in set (0.00 sec)
mysql> select count(id) from city;
+-----------+
| count(id) |
+-----------+
| 4079 |
+-----------+
1 row in set (0.00 sec)
これでサンプルデータがMySQLに入ったので、MySQLの準備は完了。
次はCommon Lispからデータベースへの接続と、データのモデル化かな。
データのモデル化にあたってはCLOSの知識が必要になる気がする(CLOS全然知らない。。。)
まずはDBIを使う準備から。以下のようにファイルを修正します。
ここで、一旦myappを再度ロードしてみます。
CL-USER> (ql:quickload :myapp)
CL-USER> (myapp:start)
すると、先程記載したdbi関連の依存パッケージをダウンロードしてきてくれます。
テストでcontrollerから触ってみたいと思ったのですが、DB が見つからないといって怒られる。。。
あれ、ちゃんと接続できてないのか、APIが変わったのか。。。
原因を調べて次回に繋げます。
clack-middleware-clsql ならちゃんと繋げれるっぽいから、そっちに変えてみようかな。
REPLからだったら出来てるんだけどなぁ。
CL-USER> (defvar *connection*
(dbi:connect :mysql
:database-name "world"
:username "myapp"
:password "********"))
*CONNECTION*
CL-USER> (let* ((query (dbi:prepare *connection*
"SELECT * FROM City "))
(result (dbi:execute query)))
(loop for row = (dbi:fetch result)
while row
do (format t "~A~%" row)
))