Common LispでWebアプリケーション#2

さて、前回の続き。 前回は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)
                 ))

Recent Posts

Loading...
blog comments powered by Disqus