Elixir / Phoenix将JSON保存到Postgres数据库

时间:2018-08-04 09:59:47

标签: json postgresql elixir phoenix-framework ecto

我已经在Google上找到了很多实现此目的的方法。

我使用phx.gen生成器生成了一些CRUD。我想在数据库中创建存储库,并为其存储Github活动。

我的迁移:

def change do
  create table(:coderepos) do
    add :name, :string
    add :description, :string
    add :repo_name, :string
    add :activity_data_raw, :jsonb
    timestamps()
  end
end

我的模特:

schema "coderepos" do
  field :activity_data_raw, :map, default: %{}
  field :name, :string
  field :description, :string
  field :repo_name, :string
  timestamps()
end

(通过生成的HTML)创建新的存储库后:

#Ecto.Changeset<
  action: :insert,
  changes: %{
    description: "Blah",
    name: "Blah",
    repo_name: "blah"
  },
  errors: [activity_data_raw: {"is invalid", [type: :map, validation: :cast]}],
  data: #App.Integrations.CodeRepo<>,
  valid?: false
>

我在控制器中的IO.inspect(changeset)函数的:error响应中执行了create,得到了上面的变更集。

我的创建功能:

def create(conn, %{"code_repo" => code_repo_params}) do
  case Integrations.create_code_repo(code_repo_params) do
    {:ok, code_repo} ->
      conn
      |> put_flash(:info, "Code repo created successfully.")
      |> redirect(to: code_repo_path(conn, :show, code_repo))
    {:error, %Ecto.Changeset{} = changeset} ->
      render(conn, "new.html", changeset: changeset)
      IO.inspect(changeset)
  end
end

这是我以表单(以及名称,描述和存储库名称)提交的JSON片段:

[{"week": 1532822400, "total": 6, "days": [0, 6, 0, 0, 0, 0, 0]}]

(只需将保存到数据库中的操作与我在应用程序中所做的其他事情一起正常工作,那么那里就没有任何问题了。)

Postgres 10.4,Elixir 1.6.5 / OTP 20,Phoenix 1.3.3,Phoenix Ecto 3.2

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

感谢Elixir Slack中的@trevoke,现在可以使用了。您需要传递一张地图(我想这很明显,尽管我读过的其他地方听起来好像已经处理过了)。在上面的评论中,Dogbert基本上是在说同样的话。

create函数中:

raw = Map.get(code_repo_params, "activity_data_raw")
code_repo_params = Map.put(code_repo_params, "activity_data_raw", %{"data" => raw})