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.exs
とlib/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
とれてる。
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の無料枠を使いスケジューリングしたい。