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してみる
データが取得出来るか確認する。
StockScraping.YahooVolumeDate |> StockScraping.Repo.all
![f:id:yuki-toida:20170606133300p:plain](https://assets.st-note.com/img/1734688650-L9b4Hi1to9.png?width=1200)
とれてる。
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まわりを。