michaelwa
My mix.exs dependencies (partial list):
{:ex_aws, “~> 2.1”},
{:ex_aws_dynamo, “~> 4.0”},
{:hackney, “~> 1.9”},
{:configparser_ex, “~> 4.0”}I created an Ecto.Schema:
I can create dyanmo tables, insert, update, and delete records just fine as long as the data records are derived from generic structs.
However, when I create an Ecto.Schema
defmodule IntandemWww.Users.User do
use Ecto.Schema
import Ecto.Changeset
@derive [ExAws.Dynamo.Encodable]
schema “users” do
field :name, :string, virtual: true
field :first_name, :string
field :middle_name, :string
field :last_name, :string
field :condition, :string
field :email, :string
field :phone, :string
field :status, :string
field :mentor, :string
field :enrollment_date, :string
timestamps()
end
end
Instance looks like this (note the “meta” attribute):
%Users.User{
meta: #Ecto.Schema.Metadata<:built, “users”>,
id: nil,
name: nil,
first_name: nil,
middle_name: nil,
last_name: nil,
condition: nil,
email: nil,
phone: nil,
status: nil,
mentor: nil,
enrollment_date: nil,
inserted_at: nil,
updated_at: nil
}
Then when I try to Encode it (with some actual data set though):
Dynamo.Encoder.encode!(new_user)
I get the following error:
** (Protocol.UndefinedError) protocol ExAws.Dynamo.Encodable not implemented for #Ecto.Schema.Metadata<:built, “users”> of type Ecto.Schema.Metadata (a struct). This protocol is implemented for the following type(s): Atom, BitString, Float, HashDict, Users.User, Integer, List, Map, MapSet, User
(ex_aws_dynamo 4.2.1) lib/ex_aws/dynamo/encodable.ex:1: ExAws.Dynamo.Encodable.impl_for!/1
(ex_aws_dynamo 4.2.1) lib/ex_aws/dynamo/encodable.ex:5: ExAws.Dynamo.Encodable.encode/2
(ex_aws_dynamo 4.2.1) lib/ex_aws/dynamo/encodable.ex:87: anonymous fn/2 in ExAws.Dynamo.Encodable.Map.do_encode/1
(stdlib 4.0.1) maps.erl:411: :maps.fold_1/3
(ex_aws_dynamo 4.2.1) lib/ex_aws/dynamo/encodable.ex:64: ExAws.Dynamo.Encodable.Map.encode/2
I looked through the encoder.ex in the ex_aws_dynamo dependency and the “meta” field is obviously not accounted for during encoding.
Is anyone using Ecto.Schema with Dynamo and if so how? Is this an oversight or were they not meant to ever work together?
I do not see any usage of the “options” that are passed to “encode” functions. Would a valid solution be to add “ignore_fields” as an array of fields to skip over?
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 5 of 5 Posts
RudManusachi
I never used those libs by myself, however, I see that
ExAws.Dynamo.Encodableaccepts option:onlyhttps://github.com/ex-aws/ex_aws_dynamo/blob/2e523c9efb81e41c13da8b62859296b5b60d3991/lib/ex_aws/dynamo/encodable.ex#L38-L44
So perhaps something like:
would do the trick?
michaelwa
Thank you!! Thank you! This gets me moving forward again!!
This worked!
I note that right below:
That there is an “except”:
I tried the three variants below. They all compile but no happiness!
I also see in the Ecto.Schema module the following:
So I would have guessed the :atom version should have worked.
michaelwa
added note: the forum altered my second post. the “:meta” is surrounded by double underscores in my code.
al2o3cr
(Note: I edited your post to use
```to preserve code-formatting, underscores etc)The
encodefunction accepts anexceptoption, but that’s distinct from the code generated when you say@derive {ExAws.Dynamo.Encodable, etc etc etc}.https://github.com/ex-aws/ex_aws_dynamo/blob/2e523c9efb81e41c13da8b62859296b5b60d3991/lib/ex_aws/dynamo/encodable.ex#L38-L52
What you want would be something like:
and then you could say:
This could make a good PR to
ExAws.Dynamo, if you added some tests. Maybe:exceptshould automatically add:__struct__michaelwa
That is a good idea. I am kind of a newbie but i do want to contribute. I’ll look at it this weekend and see if I think can come up with the solution.
Once again, thank you for you support!!