Ошибка:
14:18:04.259 [error] GenServer MyApp.Receiver.Handlers terminating
** (Ecto.Query.CastError) deps/ecto/lib/ecto/repo/queryable.ex:382: value `1234` in `where` cannot be cast to type :string in query:
from c0 in MyApp.DB.Client,
where: c0.client_id == ^1234,
select: c0
(elixir) lib/enum.ex:1940: Enum."-reduce/3-lists^foldl/2-0-"/3
(elixir) lib/enum.ex:1431: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
(elixir) lib/enum.ex:1940: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/repo/queryable.ex:138: Ecto.Repo.Queryable.execute/4
(ecto) lib/ecto/repo/queryable.ex:18: Ecto.Repo.Queryable.all/3
(ecto) lib/ecto/repo/queryable.ex:67: Ecto.Repo.Queryable.one/3
(my_app) lib/my_app/db/db_impl/db_impl.ex:54: MyApp.DBImpl.add_update_client/1
(my_app) lib/my_app/receiver/receiver_handlers.ex:23: MyApp.Receiver.Handlers.handle_cast/2
(stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:711: :gen_server.handle_msg/6
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: {:"$gen_cast", {:add_update_client, %{client_id: 1234, client_pid: #PID<0.408.0>}}}
State: %{}
@doc """
Client connects or reconnects
"""
def add_update_client(client) do
%{client_id: client_id} = client
# This is the line causing the error
client_db = DB.Client |> Repo.get_by(client_id: client_id)
create_update_client(client_db, client)
end
defmodule MyApp.DB.Client do
use Ecto.Schema
schema "client" do
field :client_id, :string
field :client_pid, :binary
timestamps()
end
# This says how you can change a record
def changeset(client, params \\ %{}) do
client
|> Ecto.Changeset.cast(params, [:client_id, :client_pid])
# Use validation if need be
|> Ecto.Changeset.validate_required([:client_id, :client_pid])
end
def update_client_pid_changeset(client, params \\ %{}) do
client
|> Ecto.Changeset.cast(params, [:client_pid])
# Use validation if need be
|> Ecto.Changeset.validate_required([:client_pid])
end
end
defmodule MyApp.Repo.Migrations.CreateClient do
use Ecto.Migration
def change do
create table(:client) do
add :client_id, :string
add :client_pid, :binary
timestamps
end
end
end
Я попытался изменить неисправную линию на эту, но все равно получаю ту же ошибку:
client_db = Repo.one(from c in DB.Client,
where: c.client_id == type(^client_id, :string)
)
Значения, которые я использую для client_id, представляют собой строки чисел, например, "1234", но иногда Ecto не может понять это. Это происходит только в 1/10 или около того тестов. Насколько я могу сказать, он работает все время, когда код работает нормально.
Я подозреваю, что это как-то связано с порядком выполнения тестов, но я не уверен в обратном.
У кого-нибудь еще была подобная проблема и потенциальное решение?
Edit:
Я думаю, что происходит то, что где-то в коде «1234» становится 1234. Хотя я не знаю, как и почему это происходит. Я извлекаю эти значения из файла json, так что я подумал, что это могло произойти из парсера, но, похоже, этого не происходит. Кроме того, все значения вставляются в БД без проблем. При обновлении однажды произошла ошибка набора изменений, поэтому каким-то образом код разбирает строку на число.
Решено:
Тестирование, которое я ранее написал, вызывало вставку в базу данных, и я использовал 1234 в тесте вместо того, чтобы корректно использовать «1234», так что это была моя ошибка все время.