前書き
`anvil-app-server`でアプリが動作させられるようになったのはいいのですが、[Anvil](https://anvil.works/)のサイトで作成した`News Aggregater`アプリを動かそうとしても、すんなりとは動いてくれないようで。。。 ちょっと調査してみました。前提
- Anvilで[News Aggregator](https://anvil.works/learn/tutorials/database-backed-apps)アプリを作成済みであること。環境
- Ubuntu 20.04 LTS 日本語 Remix - Hyper-V マネージャー 10.0.18362.1 - anvil-app-server v1.1News Aggregatorアプリのダウンロードと実行
アプリを作成すると、`View history`から`git clone`コマンドでダウンロードできます。"git clone ssh://~"の行をコピーしてコマンドで実行。
git clone ssh://XXXX@anvil.works:2222/324IEWAMVBYU2Y77.git News_Aggregater
※XXXX
にはAnvilサイトに登録したアカウントのメールアドレスが入る。
※二要素認証を有効にしているとSSHパブリックキーを使用しないといけない為、使っている場合は一時的に二段階認証を外しておく。Gitにパブリックキー登録してあればすんなりいけると思いますが。
anvil-app-server
でアプリケーションを起動。
anvil-app-server --app News_Aggregater
http://localhost:3030
にブラウザでアクセス。
問題点
News Aggrigatorアプリでは記事の`category`を`categories`テーブルに予め登録し、そこから選択する方法をとっているのですが、アプリにはテーブルのデータが含まれていないため、「空のデータ」でエラーになる。anvil-app-serverのPostgreSQLへpgadmin4でアクセス
`anvil-app-server`は独自のPostgreSQLサーバーを含んでいるので、そちらにアクセスする。- Username : postgres
- Password : (anvil-app-serverを実行したディレクトリ)/.anvi-data/postgres.password内に記載
- Port : (anvil-app-serverを実行したディレクトリ)/.anvi-data/db/postmaster.opts内に記載
が、見たところ、アプリで必要なはずのarticles
テーブルもcategories
テーブルもなし。
とりあえず、存在しているテーブルの中身を見ていくと、app_storage_tables
テーブル内にアプリで作成したテーブルの情報を発見。
また、create-anvil-app
コマンドで作成できるtodoアプリを使ってデータの作成を見ていくと、app_storage_data
テーブルにデータが追加されていることが判明。
つまりどういうことか
ここまでのことから、- アプリで使用するテーブルの情報は、
app_storage_tables
テーブルにJSON形式で格納される。 - アプリからデータにアクセスする場合は、
app_storage_tables
テーブルの情報を元に、app_storage_data
テーブルのJSON形式のデータにアクセスする。
どんなアプリを作ってもデータ層とロジック層の整合が取れるという観点では、メタテーブルを使うのは考えられなくもないですが、素人の心を挫く仕組みではあります。
その他
どのようなデータ管理なのか、少し見えてきたところで、データのインポートをしてみようと、Anvilのサイトに戻って、データのダウンロードを行ってみました。 が、ダウンロードしたデータもすんなりインポートできる内容ではありません。 今回のNews Aggrigatorの`categories`テーブルの場合、ID | name |
---|---|
[65114][57547127] | entertainment |
[65114][57547131] | business |
[65114][57547132] | travel |
[65114][57547134] | sport |
の様になっており、このデータをローカルDBのメタテーブルと整合が取れた形でJSON形式データを書き込まなければなりません。
※IDのカラムは「おそらく」Anvilでホストしているサーバーにデータが乗っている際の情報なのでローカルDBではあまり意味がなさそう。直感的にはテーブルIDとrowIDくらいかなという気はします。