logo
banner

ErlyWebでmnesiaを使う



目次

ErlyWebでmnesiaを使ってみる

ErlyWebでは各種データベースに対するORマッパーであるErlDBを使用することができます。対応しているデータベースは MySQL、PostgreSQL と Erlang のデータベースエンジンである mnesiaです。
MySQLについては ErlyWebのサイトにある チュートリアル にその手順が書かれています。ここでは、同じサンプルでmnesiaを使用する場合について紹介します。
参考:

最初にパッチ

ErlyWebのソースを修正します。
C:\Program Files\erl5.6\lib\erlyweb-0.7\src\erlydb\erlydb.erl の381行目を修正します。
修正前:

                   {value, Val} ->

修正後:

                   {value, {ok,Val}} ->

修正後 erlyweb-0.7にあるmeka.batを実行してコンパイルします。

C:\>cd C:\Program Files\erl5.6\lib\erlyweb-0.7
C:\Program Files\erl5.6\lib\erlyweb-0.7>make.bat

参考:
http://www.mail-archive.com/erlyweb@googlegroups.com/msg00151.html

mnesiaのデータベースを作る

ErlyWebが使用するテーブルを作る

最初にmnesiaのデータベースとErlyWebのシステムが使用するテーブルを準備する必要があります。 最初にmnesiaのスキーマを作成します。例として、"/work/apps/db"にデータベースを作成します。yawsをノード名(例では -sname win )とmnesiaのディレクトリを指定して実行します。-w はウィンドウを開きます。(-iでもかまいません)

 >mkdir \work\apps\db
 >yaws -w -sname win -M /work/apps/db

mnesiaのschemaは初期状態だとRAM上にあるので、ディスクに保存されるように変更します。

(win@PC-114)1> mnesia:change_table_copy_type(schema,node(),disc_copies).
{atomic,ok}

テーブルを作成します。

(win@PC-114)3> mnesia:create_table(counter, [{disc_copies, [node()]},{attributes, [key, counter]}]).
{atomic,ok}
mnesia:create_table()の内容は次のとおりです。
  • counter :テーブル名
{disc_copies, [node()]}:disc_copies オプションの指定
ディスク上にコピーを持つノードを指定 これが無いとRAM上にのみデータを持ちます。
  • {attributes, [key, counter]}:カラム名のリストの指定
keyとcounterのカラムがあります。

mnesiaを使用するコンポーネントを作る

データベースを利用するコンポーネントの雛形を作成するため、コマンドを実行します。

(win@PC-114)1> erlyweb:create_component("musician", "/work/apps/music").        
info:erlyweb_util:70: creating "/work/apps/music/src/components/musician.erl"
info:erlyweb_util:70: creating "/work/apps/music/src/components/musician_controller.erl"
info:erlyweb_util:70: creating "/work/apps/music/src/components/musician_view.erl"
ok

コンポーネントの使用するテーブルを作る

次にコンパイルするのですが、使用するテーブルが無いとエラーになるので、テーブルを作成します。

mnesia:create_table()を実行するときに、user_propertiesを指定することでカラムをカスタマイズすることができます。
user_propertiesは各カラムに対して次のような書式で指定します

{Field, {Type, Modifier}, Null, Key, Default, Extra, MnesiaType}
  • Field: テーブルのカラム名

カラム名のidまたは後ろがidの場合は、整数として扱います。その他はバイナリです。 最初のカラム名がidの場合はautoincrement します。

  • 'Type'

データベースシステムのデータタイプ ('integer', 'varchar', etc.),atomとして指定します。

  • 'Modifier'

フィールドの最大長 またはenumリストを指定します。指定しないときは 'undefined' にします。

  • 'Null'

Null値を許すか指定します。

  • 'Key'

キー値の種類を指定します。指定できる値は'primary', 'unique', 'multiple' または 'undefined'です。

  • 'Default'

デフォルト値を指定します。

  • 'Extra'

フィールドの付加的な情報につかわれますが、現在のところ指定できるのは 'identity'または 'undefined'だけです。

  • MnesiaType:

mnesiaに保存されるデータタイプです。 atom, list, binary, integer, float, datetime, date, time, undefined が指定できます。

次は、mnesiaでテーブルを作成するコマンドの例です。

mnesia:create_table(
  musician,
 [
    {disc_copies, [node()]},
    {attributes, [id,name,birth_date,instrument,bio]},
    {user_properties,
      [
        {id,{integer, undefined}, false, primary, undefined, identity, integer},
        {name,{varchar, 20}, false, undefined, undefined, undefined, atom}, 		
        {birth_date, {datetime, undefined}, true, undefined, undefined, undefined,   undefined},
        {instrument, {enum, ["guitar", "piano", "drums", "vocals"]}, true, undefined, undefined, undefined, undefined}
      ]
    }
  ]
)

実際に実行した結果です。

(win@PC-114)3> mnesia:create_table(musician,[{disc_copies, [node()]},{attributes, [id,name,birth_date,instrument,bio]},{user_properties,[{id,{integer, undefined}, false, primary, undefined, identity, integer},{name,{varchar, 20}, false, undefined, undefined, undefined, atom},{birth_date, {datetime, undefined}, true, undefined, undefined, undefined, undefined},{instrument, {enum, ["guitar", "piano", "drums", "vocals"]}, true, undefined, undefined, undefined, undefined}]}]).
{atomic,ok}

コンパイルします。 コンパイルオプションには[{erlydb_driver, mnesia}]でデータベースドライバにmnesiaを指定します。

(win@PC-114)4> erlyweb:compile("/work/apps/music",[{erlydb_driver, mnesia}]).   
debug:erlyweb_compile:382: Compiling Erlang file "music_app_controller"         
debug:erlyweb_compile:382: Compiling Erlang file "musician_view"                
debug:erlyweb_compile:382: Compiling Erlang file "musician_controller"          
debug:erlyweb_compile:382: Compiling Erlang file "musician"                     
debug:erlyweb_compile:382: Compiling Erlang file "forms_controller"          
debug:erlyweb_compile:377: Compiling ErlTL file "forms_view"
debug:erlyweb_compile:382: Compiling Erlang file "html_container_controller"
debug:erlyweb_compile:377: Compiling ErlTL file "html_container_view"
debug:erlyweb_compile:114: Generating ErlyDB code for models: "musician.erl "
debug:erlydb:355: 

--- To skip foreign key checks, compile with the {skip_fk_checks, true} option

debug:erlydb:391: Generating code for musician
{ok,{{2008,2,28},{11,21,22}}}

ここまでで、http://localhost:8000/music/musician/ を開くとデフォルトのページが表示されます。 画像:Erlyweb-musician-new.gif

ORマッパでデータを入力する。

デフォルトで作成されるページを見るために、データを入力してみます。
musicianコンポーネントにORマッパの機能が追加されているのでそれを利用します。
以下では、new(),set_fields(),insert()の各関数を使用して2つのレコードを入力しています。

(win@PC-114)5> Rec = musician:new().
{musician,true,undefined,undefined,undefined,undefined,
          undefined}
(win@PC-114)6> Rec1 = musician:set_fields(Rec,[{name,"John Lennon"},{birth_date, "1940/10/9"},{instrument, "vocals"},{bio,"An iconic English 20th century rock and roll songwriter and singer..."}]).
{musician,true,undefined,"John Lennon","1940/10/9","vocals",
          "An iconic English 20th century rock and roll songwriter and singer..."}
(win@PC-114)7> Rec2 = musician:set_fields(Rec,[{name,"Paul McCartney"},{birth_date, "1942/6/18"},{instrument,  "piano"},{bio, "Sir James Paul McCartney is a popular Grammy Award-winning English artist..."}]).
{musician,true,undefined,"Paul McCartney","1942/6/18",
          "piano",
          "Sir James Paul McCartney is a popular Grammy Award-winning English artist..."}
(win@PC-114)8> musician:insert(Rec1).
erlydb_mnesia:205 ["In q with: ",
                   {insert,musician,
                           [name,birth_date,instrument,bio],
                           [["John Lennon","1940/10/9","vocals",
                             "An iconic English 20th century rock and roll songwriter and singer..."]]}] 
1
(win@PC-114)9> musician:insert(Rec2).
erlydb_mnesia:205 ["In q with: ",
                   {insert,musician,
                           [name,birth_date,instrument,bio],
                           [["Paul McCartney","1942/6/18","piano",
                             "Sir James Paul McCartney is a popular Grammy Award-winning English artist..."]]}] 
1

http://localhost:8000/music/musician にアクセスするとチュートリアル にあるようなページが表示されます。

Copyright (C) 2007 KLab Inc. All Rights Reserved.