markdev

markdev

Inserting JSONB into Postgres via Ecto

I’m trying to pass jsonb data into postgres via ecto. I’d like to be able to take a valid JSON string, add it as a graphql argument, and see that json in my table.

migration

defmodule MyApp.CreateJsonTable do
    use Ecto.Migration

    def change do
      create table(:geodata) do
         add(:json, :map)
         timestamps(type: :utc_datetime)
      end
   end
end

My understanding is that you need to define a struct for Poison for JSONB, and then decode into that when you insert.

defmodule Geodatajson do
  use MyApp, :model

  embedded_schema do
    field(:latitude, :float)
    field(:longitude, :float)
  end
end

now the model:

defmodule MyApp.Geodata do
  use MyApp, :model

  alias MyApp.Repo
  alias MyApp.Geodata

  schema "geodata" do
    embeds_one(:json, Geodatajson)

    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:json])
  end

  def add_geodata(str) do
    json = str |> Poison.decode!(as: Geodatajson)
    data = %Geodata{json: json}
    Repo.insert(data)
  end
end

I try to pass in the data like this:

iex> MyApp.Geodata.add_geodata("{\"latitude\": 1.23, \"longitude\": 4.56}")

but the JSONB does not get decoded:

{:ok,
 %MyApp.Geodata{
   __meta__: #Ecto.Schema.Metadata<:loaded, "geodata">,
   id: 26,
   inserted_at: ~N[2018-04-28 13:28:42.346382],
   json: %Geodatajson{
     id: "3b22ef94-92eb-4c64-8174-9ce1cb88e8c5",
     latitude: nil,
     longitude: nil
   },
   updated_at: ~N[2018-04-28 13:28:42.346392]
 }}

What can I do to get this data into postgres?

Marked As Solved

blatyo

blatyo

Conduit Core Team

Since you’re using an embed, you need to use either cast_embed/3 or put_embed/4 in your changeset. You could also, not use an embed, in which case you’re schema would have field :json, :map instead of embeds_one :json, Geodatajson and your changeset would work fine.

Where Next?

Popular in Questions Top

stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31525 112
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

We're in Beta

About us Mission Statement