最近、Elixir+Phoenixを勉強し始めてサンプルWebを作りまくっていたら、デフォルトデータベースがPostgreSQLなので気がついたら大量のDBが作られまくっていたという経験をしました。
そこでSqlite3を使って各プロジェクトのローカルフォルダにデータベースを作るようにしてみます。
(Docker Composeを使う方法も試したのですがトラブルが起きた時に原因の特定が難しくなるのが難点)
環境
- macOS Mojave 10.14
- Elixir 1.9.2
- Phoenix 1.4.10
手順
まず普通にPhoenixプロジェクトを作成します。
$ mix phx.new blog
Fetch and install dependencies? [Yn] y
$ cd blog
mix.exsに必要なライブラリを追加する
(ここのバージョンの依存関係で結構苦労した)
defp deps do
[
{:phoenix, "~> 1.4.10"},
{:phoenix_pubsub, "~> 1.1"},
{:phoenix_ecto, "~> 3.6"}, # 4.0 → 3.6に変更
# {:ecto_sql, "~> 3.2"}, # 不要
# {:postgrex, ">= 0.0.0"}, # 不要
{:ecto, "~> 2.2.9"}, # 追加
{:sqlite_ecto2, "~> 2.4"}, # 追加
{:phoenix_html, "~> 2.11"},
{:phoenix_live_reload, "~> 1.2", only: :dev},
{:gettext, "~> 0.11"},
{:jason, "~> 1.0"},
{:plug_cowboy, "~> 2.0"}
]
end
一旦クリーンにしてから再度インストール
$ mix deps.clean --all
$ rm mix.lock
$ mix deps.get
エラーがでなければ成功。
プロジェクトの修正
# Configure your database
config :blog, Blog.Repo,
adapter: Sqlite.Ecto2,
database: "blog.sqlite3"
defmodule Blog.Repo do
use Ecto.Repo,
otp_app: :blog,
adapter: Sqlite.Ecto2 # 変更
end
DBを作成してサーバーを立ち上げる。
$ mix ecto.create
$ mix phx.server
ブラウザで http://localhost:4000 にアクセスしてPhoenixのページが表示されれば一先ず成功です。
プロジェクトのフォルダにはblog.sqlite3というDBのファイルができていると思います。
サンプルブログを作成してみる
これだけだとSqlite3が使われてるのがどうかわからないので、試しにブログっぽいWebサイトをジェネレートしてみます。
$ mix phx.gen.html Articles Article articles title body:text
$ mix ecto.migrate
scope "/", BlogWeb do
pipe_through :browser
- get "/", PageController, :index
+ get "/", ArticleController, :index #変更
+ resources "/articles", ArticleController # 追加
end
$ mix phx.server
コードの修正が数カ所あるので構築のスピード感が落ちるのは残念です。
それでもサンプルを作りっぱなしにしてもDBを汚さないというのは利点かもしれません。