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

标签 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
>

我通过在 Controller 中的 create 函数的 :error 响应中执行 IO.inspect(changeset) 来获得上面的变更集.

我的创建函数:

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

如有任何帮助,我们将不胜感激!

最佳答案

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

创建函数中:

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

关于json - Elixir/Phoenix 将 JSON 保存到 Postgres 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51684471/

相关文章:

javascript - 使用 Javascript 读取 JSON 文件

php - Laravel REST API 和高 CPU 负载

postgresql - 外键 : on delete set null but only for one field of relation

postgresql - 在二进制 Windows (7) 64 位 Enterprise DB 安装上创建 PLTCL 语言时出错

postgresql - 如何检查 Postgres 中的字符串不等式

phoenix-framework - Phoenix Controller 测试,设置请求主机

erlang - 是否可以向 elixir/erlang 中的所有子进程发送消息?

java - POST 方法中 JSON 中的无关后缀数据

json - 如何克服 "Conflicting setter definitions for property "?

elixir - 用小数点格式化数字