# Inserting JSONB into Postgres via Ecto

**URL:** <https://forum.elixirforum.com/t/inserting-jsonb-into-postgres-via-ecto/13929>\
**Category:** Questions\
**Tags:** ecto, phoenix, jsonb, postgres\
**Created:** [April 28, 2018, 1:42pm UTC](https://forum.elixirforum.com/t/inserting-jsonb-into-postgres-via-ecto/13929 "2018-04-28T13:42:59Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![markdev](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/markdev/32/9635_2.png) [@markdev](https://forum.elixirforum.com/u/markdev)\
**Post date:** [April 28, 2018, 1:42pm UTC](https://forum.elixirforum.com/t/inserting-jsonb-into-postgres-via-ecto/13929/1 "2018-04-28T13:42:59Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![blatyo](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/blatyo/32/4554_2.png) [@blatyo](https://forum.elixirforum.com/u/blatyo)\
**Post date:** [April 28, 2018, 1:57pm UTC](https://forum.elixirforum.com/t/inserting-jsonb-into-postgres-via-ecto/13929/2 "2018-04-28T13:57:38Z")

</div>

Since you’re using an embed, you need to use either [cast\_embed/3](https://hexdocs.pm/ecto/Ecto.Changeset.html#cast_embed/3) or [put\_embed/4](https://hexdocs.pm/ecto/Ecto.Changeset.html#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.
