Powered by AppSignal & Oban Pro

Bulk Create

plato/priv/notebooks/bulk_create.livemd

Bulk Create

Cleanup

alias Explorer.DataFrame
alias Plato.Domain
alias Plato.Repo
Repo.transact(
  fn ->
    for problem <- Domain.list_problems!() do
      IO.inspect(problem)
      Domain.destroy_problem!(problem)
    end

    for student <- Domain.list_students!() do
      IO.inspect(student)
      Domain.destroy_student!(student)
    end

    for campus <- Domain.list_campuses!() do
      IO.inspect(campus)
      Domain.destroy_campus!(campus)
    end

    Repo.rollback(:test)
    {:ok, nil}
  end,
  timeout: :timer.minutes(30)
)

Students

# df
rows =
  df
  |> DataFrame.to_rows(atom_keys: true)
Repo.transact(
  fn ->
    campuses = Domain.list_campuses!() |> Map.new(&amp;{&amp;1.name, &amp;1})

    rows
    |> Enum.map(&amp; &amp;1.campus_name)
    |> Enum.uniq()
    |> Enum.reject(&amp;Map.has_key?(campuses, &amp;1))
    |> Enum.each(fn campus_name ->
      Domain.create_campus(%{name: campus_name}) |> IO.inspect()
    end)

    campuses = Domain.list_campuses!() |> Map.new(&amp;{&amp;1.name, &amp;1})

    results =
      rows
      |> Enum.map(fn params ->
        campus = Map.fetch!(campuses, params.campus_name)
        params = Map.delete(params, :campus_name) |> Map.put(:campus_id, campus.id)
        Domain.create_student(params) |> IO.inspect()
      end)

    Repo.rollback(:test)
    {:ok, results}
  end,
  timeout: :timer.minutes(30)
)

Problems

# df
rows =
  df
  |> DataFrame.to_rows(atom_keys: true)
Repo.transact(
  fn ->
    campuses = Domain.list_campuses!() |> Map.new(&amp;{&amp;1.name, &amp;1})

    rows
    |> Enum.map(&amp; &amp;1.campus_name)
    |> Enum.uniq()
    |> Enum.reject(&amp;Map.has_key?(campuses, &amp;1))
    |> Enum.each(fn campus_name ->
      Domain.create_campus(%{name: campus_name}) |> IO.inspect()
    end)

    campuses = Domain.list_campuses!() |> Map.new(&amp;{&amp;1.name, &amp;1})

    results =
      rows
      |> Enum.map(fn params ->
        campus = Map.fetch!(campuses, params.campus_name)
        params = Map.delete(params, :campus_name) |> Map.put(:campus_id, campus.id)
        Domain.create_problem(params) |> IO.inspect()
      end)

    Repo.rollback(:test)
    {:ok, results}
  end,
  timeout: :timer.minutes(30)
)