Hello, I am tearing my hair out trying to figure out why this doesn’t work. I am probably doing something dumb but I can’t figure it out. I’m very new to Elixir.
I’ve widdled my schema down to next to nothing to try and figure out what’s wrong. Here’s the migration:
defmodule TestApp.Repo.Migrations.CreateUsers do
use Ecto.Migration
def change do
create table(:users, primary_key: false) do
add :id, :binary_id, primary_key: true
add :username, :string, null: false
end
end
end
And the schema file:
defmodule TestApp.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
schema "users" do
field :username, :string
end
def changeset(user, attrs) do
user
|> cast(attrs, [:username])
end
end
And then some code to insert a test object:
TestApp.Accounts.User.changeset(%TestApp.Accounts.User{}, %{username: "ben"})
|> TestApp.Repo.insert()
Running that produces this:
** (Protocol.UndefinedError) protocol String.Chars not implemented for %Postgrex.Query{columns: nil, name: "", param_formats: nil, param_oids: nil, param_types: nil, ref: nil, result_formats: nil, result_oids: nil, result_types: nil, statement: ["INSERT INTO ", [34, "users", 34], [], [32, 40, [[], 34, "id", 34], ") VALUES ", [], 40, [[], 36 | "1"], 41], []], types: nil}. This protocol is implemented for: Atom, BitString, Date, DateTime, Ecto.Date, Ecto.DateTime, Ecto.Time, Float, Integer, List, NaiveDateTime, Time, URI, Version, Version.Requirement
(elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1
(elixir) lib/string/chars.ex:22: String.Chars.to_string/1
(ecto) lib/ecto/adapters/sql.ex:613: Ecto.Adapters.SQL.log/4
(db_connection) lib/db_connection.ex:1186: DBConnection.log/6
(db_connection) lib/db_connection.ex:591: DBConnection.prepare_execute/4
(ecto) lib/ecto/adapters/postgres/connection.ex:86: Ecto.Adapters.Postgres.Connection.execute/4
(ecto) lib/ecto/adapters/sql.ex:256: Ecto.Adapters.SQL.sql_call/6
(ecto) lib/ecto/adapters/sql.ex:542: Ecto.Adapters.SQL.struct/8
(ecto) lib/ecto/repo/schema.ex:547: Ecto.Repo.Schema.apply/4
(ecto) lib/ecto/repo/schema.ex:213: anonymous fn/14 in Ecto.Repo.Schema.do_insert/4
(elixir) lib/code.ex:677: Code.require_file/2
(mix) lib/mix/tasks/run.ex:136: Mix.Tasks.Run.run/5
(mix) lib/mix/tasks/run.ex:76: Mix.Tasks.Run.run/1
(mix) lib/mix/task.ex:314: Mix.Task.run_task/3
(mix) lib/mix/cli.ex:80: Mix.CLI.run_task/2
I’ve done mix ecto.drop && mix ecto.create && mix ecto.migrate
and all goes fine. I’ve also verified in iex that the changeset is valid. But when passing the changeset to Repo.insert
it blows up with that error.
What am I doing wrong? What are some good ways to go about debugging this?