20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PostgreSQL or MySQL版】ExcelからElixir入門③:WebにDBデータ表示

Last updated at Posted at 2018-10-07

【本コラムは、5分で読めて、20分くらいでお試しいただけます】
piacereです、ご覧いただいてありがとございます :bow:

今回は、DBMSをインストールした後、Web上にDBデータを表示します

■「ExcelからElixir入門」シリーズの目次
①データ並替え/絞り込み
|> ②データ列抽出、Web表示
|> ③WebにDBデータ表示
|> ④Webに外部APIデータ表示
|> ⑤Webにグラフ表示
|> ⑥Vue.js+内部API(表示編)
|> ⑦Vue.js+内部API(更新編)
|> ⑧Gigalixirに本番リリース
|> ⑨Elixir/PhoenixのCRUD Webアプリをリリース
|> ⑩「LiveView」ElixirサーバサイドのみでReact的SPA/リアルタイムUIが作れる
|> ⑪LiveView製Qiita検索SPAをフォームsubmitスタイルに換装
|> ⑫LiveViewのコード内HTMLをテンプレートファイルに分離
|> ⑬ElixirサーバサイドSPAをスマホで見るためにGigalixirリリース
|> ⑭Gigalixir上のLiveViewアプリに独自ドメイン名を付与して正式なアプリ公開

DBのインストール

まずは、DBサーバをインストールします

ここでは、DBサーバとして、「PostgreSQL」か「MySQL」のいずれかをインストールすることとします

image.png

パスワードは、PostgreSQLは「postgres」、MySQLは未設定(空文字列)で設定しておくと、Phoenix PJ作成後に設定変更が不要になります

※下記リンク先コラムの中には、「パスワードの weak 評価はダメ」といった記載ありますが、本番環境の構築をしている訳では無いので構いません

①PostgreSQLのインストール

image.png

下記OS毎のインストール手順を実施してください

Windows:https://eng-entrance.com/postgresql-download-install
macOS:https://qiita.com/okame_qiita/items/ac7b6a7d96d07ecbc50b
Ubuntu:https://qiita.com/eighty8/items/82063beab09ab9e41692
CentOS 7:https://weblabo.oscasierra.net/postgresql10-centos7-install/
CentOS 6:https://weblabo.oscasierra.net/postgresql-installing-postgresql9-centos6-1/

なおUbuntuの場合、インストール直後のpostgresユーザのパスワードを下記SQLで設定し、PostgreSQLを再起動する必要があります

ALTER USER postgres WITH PASSWORD 'postgres';

②MySQLのインストール

image.png

下記OS毎のインストール手順を実施してください

Windows:https://qiita.com/KeisyaRinco/items/c3074d8450cad96f7e4f
macOS:https://qiita.com/griffin3104/items/c7908359a3e3e18cd269
Ubuntu:https://www.server-world.info/query?os=Ubuntu_16.04&p=mysql
CentOS 7:https://enomotodev.hatenablog.com/entry/2016/09/01/225200
CentOS 6:https://qiita.com/UmedaTakefumi/items/924cdce7cfff083bf492

DBを使うPhoenixのPJ作成、DB作成、起動

DBを使うPhoenixプロジェクトを作成する際は、前回のPhoenix PJ作成時に指定していた、「--no-ecto」の指定は行いません

あと、PostgreSQLの場合は、DB指定不要ですが、MySQLの場合は、DB指定が必要です

※PostgreSQLの場合
mix phx.new sample_db --no-webpack
Fetch and install dependencies? [Yn] (←n、Enterを入力)
…
※MySQLの場合
mix phx.new sample_db --database=mysql
Fetch and install dependencies? [Yn] (←n、Enterを入力)
…

パスワードを、以下以外で設定している場合は、config/dev.exsの「password」項目の修正が必要です

  • PostgreSQL:postgres
  • MySQL:未設定(空文字列)
config/dev.exs ※PostgreSQLの場合

# Configure your database
config :sample_db, SampleDb.Repo,
  username: "postgres",
  password: "postgres",
  database: "sample_db_dev",
  hostname: "localhost",
  show_sensitive_data_on_connection_error: true,
  pool_size: 10
config/dev.exs MySQLの場合

# Configure your database
config :sample_db, SampleDb.Repo,
  username: "root",
  password: "",
  database: "sample_db_dev",
  hostname: "localhost",
  show_sensitive_data_on_connection_error: true,
  pool_size: 10

PJフォルダに入り、DBを作成します ※作成しないとiex内でエラー連発となるのでお忘れなく

cd sample_db
mix ecto.create

Phoenixを起動します

iex -S mix phx.server

ブラウザで「http://localhost:4000」にアクセスすると、Phoenixで作られたWebページが見れます
image.png

複数列データと同じ構造のテーブル作成、データ投入

テーブル作成のため、各DBクライアントを実行します

PostgreSQLクライアントの場合、「psql」コマンドを入力し、パスワード入力します

※PostgreSQLの場合
psql -U postgres

Password for user postgres:
psql (10.1)
Type "help" for help.

postgres=#

MySQLクライアントの場合は、「mysql」コマンドを入力し、パスワード入力します

※MySQLの場合
mysql

Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.22-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, 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>

アクセス先DBを「sample_db_dev」に変更するため、以下を入力します

※PostgreSQLの場合
postgres=# \c sample_db_dev
※MySQLの場合
mysql> use sample_db_dev

前回の複数列データと同じデータ構造のテーブルを作成するため、以下をpsql/mysql内で入力します

create table members
(
  id integer, 
  name varchar(255), 
  age integer, 
  team varchar(255), 
  position varchar(255) 
);

続けて、以下でデータ投入するため、以下をpsql/mysql内で入力します

insert into members values( 1, 'enぺだーし', 54, '有限会社デライトシステムズ', '代表取締役、性能探求者' );
insert into members values( 2, 'ざっきー', 50, '公立大学法人 北九州市立大学', '准教授、カーネルハッカー' );
insert into members values( 3, 'たくと', 40, 'カラビナテクノロジー株式会社', 'リードエンジニア、アプリマイスター' );
insert into members values( 4, 'piacere', 48, '株式会社DigiDockConsulting', '常務取締役CTO、技術顧問、重力プログラマ' );

以下を入力して、各DBクライアントを終了します

※PostgreSQLの場合
postgres=# \q
※MySQLの場合
mysql> exit

DBアクセスモジュールを作る

PJフォルダ内のlibフォルダ配下にutilフォルダを掘り、DBアクセスする以下モジュールを作ります

なお、ここではSQLをそのまま実行できるよう本モジュールを作りますが、実際のPJだとSQLインジェクションの原因となってしまうため、Ecto DSLを使うようにしてください

lib/util/db.ex
defmodule Db do
  def query(sql) when sql != "" do
    {:ok, result} = Ecto.Adapters.SQL.query(SampleDb.Repo, sql, [])
    result
  end
  def columns_rows(result) do
    result
    |> rows
    |> Enum.map(fn row -> Enum.into(List.zip([columns(result), row]), %{}) end)
  end
  def rows(%{rows: rows} = _result), do: rows
  def columns(%{columns: columns} = _result), do: columns
end

DBデータをWeb表示

さて、準備が整いましたので、DBデータをWeb表示してみます

以下のように、Webページの元となるファイルを書き換えます

lib/basic_db_web/templates/page/index.html.heex
<%
datas = Db.query("select * from members") |> Db.columns_rows
%>
<table>
<%= for n <- datas do %>
<tr>
  <td><%= n["name"] %></td>
  <td><%= n["age"] %></td>
  <td><%= n["team"] %></td>
  <td><%= n["position"] %></td>
</tr>
<% end %>
</table>

以下のようなWebページが表示されるようになります
image.png

SQLが分かる方は、DB内のデータを直接いじって、表示内容が変わることをお楽しみいただいてもOKです

なお、datas の作成部分以外は、前回のマップリストと全く同じコードです(つまり、Elixir内部のデータ構造が全く同じ、なので、それを処理する側も全く同じ書き方で良い、ということを意味しています)

前回マップリスト版のindex.html.heex
<%
datas = [
  %{"name" => "enぺだーし", "age" => 54, "team" => "有限会社デライトシステムズ", "position" => "代表取締役、性能探求者"}, 
  %{"name" => "ざっきー", "age" => 50, "team" => "公立大学法人 北九州市立大学", "position" => "准教授、カーネルハッカー"}, 
  %{"name" => "たくと", "age" => 40, "team" => "カラビナテクノロジー株式会社", "position" => "リードエンジニア"}, 
  %{"name" => "piacere", "age" => 48, "team" => "株式会社DigiDockConsulting", "position" => "常務取締役CTO、技術顧問、重力プログラマ"}
]
%>
<table>
<%= for n <- datas do %>
<tr>
    <td><%= n["name"] %></td>
    <td><%= n["age"] %></td>
    <td><%= n["team"] %></td>
    <td><%= n["position"] %></td>
</tr>
<% end %>
</table>

【参考】本コラムの検証環境

本コラムは、以下環境で検証しています(恐らくUbuntu実機やMacでも動きます)

  • Windows 10
    • 実機+Elixir 1.8.1
      • Phoenix 1.4.2
    • 実機+Elixir 1.6.x
      • Phoenix 1.3.x
    • Docker+Elixir 1.6.x
      • Phoenix 1.3.x

終わり

今回で、DBデータをWebで表示できるようになりました

関数型言語によるWeb+DB開発が、こんなカンタンに出来ちゃうんだ … と感じていただけたら幸いです

データ元がDBに変わっても、画面側のコードが変わらなかったことに着目すると、関数型言語の威力がじょじょに見えてきます

次回は、Webに外部APIデータ表示 を行い、やはり画面側は、一切手直しがいらないことを更に実感していただきます

20
8
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?