I have a Phoenix app that already set up a schema, a controller and a router…
I would like to populate data into my created schema through seeds.exs
I have a csv file and I created a file CSVUtil.ex which is like this:
defmodule CampaignsApi.Store.Campaign do
@moduledoc """
Utility module to ingest `campaigns.csv`
"""
alias NimbleCSV.RFC4180, as: CSV
alias CampaignsApi.{Store.Campaign, Repo}
def column_data(file) do
column_names = get_column_names(file)
file
|> File.stream!()
|> CSV.parse_stream(skip_headers: true)
|> Enum.map(fn row ->
row
|> Enum.with_index()
|> Map.new(fn {val, num} -> {column_names[num], val} end)
|> create_or_skip()
end)
end
def get_column_names(file) do
file
|> File.stream!()
|> CSV.parse_stream(skip_headers: false)
|> Enum.fetch!(0)
|> Enum.with_index()
|> Map.new(fn {val, num} -> {num, val} end)
end
def create_or_skip(row) do
case Repo.get_by(Campaign,
id: row["id"]
) do
nil ->
Repo.insert(
%Campaign{}
|> Campaign.changeset(%{
id: Integer.new(row["id"]),
name: row["name"],
start_date: row["start_date"],
end_date: row["end_date"],
budget: Integer.new(row["budget"]),
hashtags: row["hashtags"],
team_id: Integer.new(row["team_id"]),
description: row["description"]
})
)
campaign ->
{:ok, campaign}
end
end
end
I ran mix test and my schema is working fine, and after I ran a seed file that run functions from CSVUtil.
I got this error:
** (Module.Types.Error) found error while checking types for CampaignsApi.Store.update_campaign/2
def update_campaign(%CampaignsApi.Store.Campaign{} = campaign, attrs) do
CampaignsApi.Repo.update(
CampaignsApi.Store.Campaign.changeset(
campaign,
attrs
)
)
end
Please report this bug: https://github.com/elixir-lang/elixir/issues
** (UndefinedFunctionError) function CampaignsApi.Store.Campaign.__struct__/0 is undefined or private
CampaignsApi.Store.Campaign.__struct__()
(elixir 1.13.1) lib/module/types/of.ex:131: Module.Types.Of.struct/3
(elixir 1.13.1) lib/module/types/pattern.ex:750: Module.Types.Pattern.of_shared/4
(elixir 1.13.1) lib/module/types/pattern.ex:47: Module.Types.Pattern.of_pattern/3
(elixir 1.13.1) lib/module/types/helpers.ex:93: Module.Types.Helpers.do_map_reduce_ok/3
(elixir 1.13.1) lib/module/types/pattern.ex:12: Module.Types.Pattern.of_head/4
(elixir 1.13.1) lib/module/types.ex:62: Module.Types.warnings_from_clause/6
(elixir 1.13.1) lib/module/types.ex:22: anonymous fn/8 in Module.Types.warnings/5
I am also new to this technology and I dont know what to do to get that CSVUtil works probably…


















