こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はPhoenix1.7でDBにデータを投入するスクリプトを作成しました。
目的
Phoenix1.7でDBに1件または複数件のデータを投入するスクリプトを作成する。
実行環境
Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.14.3
Phoenix v1.7.2
※piyopiyoというプロジェクト名でPhoenixプロジェクトを作成後、mix phx.gen.live User User users name:string age:integer
を実行してルーティング追加およびmigrationまで実施済。
Phoenix1.7でDBにデータが追加される処理順の確認
エンドポイント/users内のNew Userボタンを押下したとき
PiyopiyoWeb.UserLive.FormComponentの :newを呼び出す。
<.modal :if={@live_action in [:new, :edit]} id="user-modal" show on_cancel={JS.patch(~p"/users")}>
<.live_component
module={PiyopiyoWeb.UserLive.FormComponent}
id={@user.id || :new}
title={@page_title}
action={@live_action}
user={@user}
patch={~p"/users"}
/>
</.modal>
Userを新規登録するためのモーダルをrenderする。
def render(assigns) do
~H"""
<div>
<.header>
<%= @title %>
<:subtitle>Use this form to manage user records in your database.</:subtitle>
</.header>
<.simple_form
for={@form}
id="user-form"
phx-target={@myself}
phx-change="validate"
phx-submit="save"
>
<.input field={@form[:name]} type="text" label="Name" />
<.input field={@form[:age]} type="number" label="Age" />
<:actions>
<.button phx-disable-with="Saving...">Save User</.button>
</:actions>
</.simple_form>
</div>
"""
end
モーダルのフォーム内にバリデーション上有効なNameとAgeを記載後、Save Userボタンを押下したとき
Users.create_userを呼び出し、DBに追加する処理を行う。
def handle_event("save", %{"user" => user_params}, socket) do
save_user(socket, socket.assigns.action, user_params)
end
#------中略------
defp save_user(socket, :new, user_params) do
case Users.create_user(user_params) do
{:ok, user} ->
notify_parent({:saved, user})
{:noreply,
socket
|> put_flash(:info, "User created successfully")
|> push_patch(to: socket.assigns.patch)}
{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign_form(socket, changeset)}
end
end
def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end
以上を踏まえてデータスクリプト作成
1件データを追加するスクリプト
alias Piyopiyo.Users
Users.create_user(
%{"age" => "1", "name" => "Mike"}
)
スクリプトの実行
mix run priv/repo/seeds.exs
複数件データを追加するスクリプト
#データ投入する関数
alias Piyopiyo.Users
defmodule ListUtils do
def create_users([]) do
end
def create_users([head | tail]) do
Users.create_user(head)
create_users(tail)
end
end
# 投入するデータをマップリストの形でここに書く
list = [
%{"age" => 20, "name" => "Alice"},
%{"age" => 35, "name" => "Bob"},
%{"age" => 49, "name" => "Candy"}
]
#複数件データ投入を実行
ListUtils.create_users(list)
スクリプトの実行
mix run priv/repo/seeds.exs
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩