パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

ElixirでMySQLに株価をInsert

前回の続き。
今回はO/RマッパーであるEctoを使い、MySQLにデータを保存する。

Ectoをセットアップする

mix.exsのdepsに下記を追加しライブラリをダウンロードする。

{:ecto, "~> 2.1.4"},
{:mariaex, "~> 0.8.2"},

リポジトリを作成する

rオプションでリポジトリ名をつけてコマンドを実行する。

mix ecto.gen.repo -r StockScraping.Repo

すると、config/config.exslib/stock_scraping/repo.exが作成される。

config.exsを設定する

config.exsの各フィールドにMySQLの接続情報を入れる。
最後の行は自動生成されないので追記する。

use Mix.Config

config :stock_scraping, StockScraping.Repo,
  adapter: Ecto.Adapters.MySQL,
  database: "stock_scraping",
  username: "ytoida",
  password: "",
  hostname: "localhost",
  port: 3306

config :stock_scraping, ecto_repos: [StockScraping.Repo]

Supervisorの設定

SupervisorにStockScraping.Repoを監視させる。
Supervisorについてはよくわかってないので、いつかまとめたもの書く。
lib/stock_scraping/application.exのchildrenにworkerを追加する。

defmodule StockScraping.Application do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(StockScraping.Repo, []),
    ]

    opts = [strategy: :one_for_one, name: StockScraping.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

これで、StockScraping.Repoプロセスが死んでもすぐに再起動してくれるはず。
ここまでがEctoのテンプレ設定っぽい。

Schemaを作成する

Ecto.Schema – Ecto v2.1.4
Ecto.Schemaを、lib/stock_scraping/[テーブル名].exで作成する。
この時@primary_keyを設定することを忘れない。{:id, :id, autogenerate: true}がデフォルトなので要注意。

defmodule StockScraping.YahooVolumeDate do
  use Ecto.Schema

  @primary_key {:date, :naive_datetime, autogenerate: false}
  schema "yahoo_volume_date" do
    field :add_date, :naive_datetime
    field :updt_date, :naive_datetime
  end
end

ここまででMySQLに接続出来るはず。

MySQLからテストデータをSelectしてみる

コマンドラインからMySQLのデータが取得出来るか確認する。

StockScraping.YahooVolumeDate |> StockScraping.Repo.all

f:id:yuki-toida:20170606133300p:plain
とれてる。

MySQLにInsertしてみる

流れとしては、対象サイトの更新日時を取得してDateにコンバート。
そのままPKにしてInsertする、以下抜粋。

if StockScraping.YahooVolumeDate |> get_by(date: date) do
  # データが存在している場合はUpdate(後日実装)
else
  # データが存在していない場合はInsert
  naive_datetime = Timex.to_naive_datetime(Timex.local())
  row = %StockScraping.YahooVolumeDate
  {
    date: date,
    add_date: naive_datetime,
    updt_date: naive_datetime
  }
  insert(row)
end

これで、MySQLへの接続とSelect/Insertは実装出来た。
次回はUpdateの処理と、AWSの無料枠を使いスケジューリングしたい。