8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Phoenix1.7 DBに投入データスクリプト作成

Last updated at Posted at 2023-06-01

こんにちは!
プログラミング未経験文系出身、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ボタンを押下したとき

image.png

PiyopiyoWeb.UserLive.FormComponentの :newを呼び出す。

lib/piyopiyo_web/live/user_live/index.html.heex
<.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する。

lib/piyopiyo_web/live/user_live/form_component.ex
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ボタンを押下したとき

image.png

Users.create_userを呼び出し、DBに追加する処理を行う。

lib/piyopiyo_web/live/user_live/form_component.ex
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
lib/piyopiyo/users.ex
def create_user(attrs \\ %{}) do
    %User{}
    |> User.changeset(attrs)
    |> Repo.insert()
end

DBにデータが追加された。
image.png

以上を踏まえてデータスクリプト作成

1件データを追加するスクリプト

priv/repo/seeds.exs
  alias Piyopiyo.Users

  Users.create_user(
    %{"age" => "1", "name" => "Mike"}
  )

スクリプトの実行

shell
mix run priv/repo/seeds.exs

image.png

複数件データを追加するスクリプト

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)

スクリプトの実行

shell
mix run priv/repo/seeds.exs

image.png

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

8
1
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
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?