Как ввести :binary_id в командной строке iex?

Я пишу приложение на Эликсире с Postgres в качестве хранилища данных. В Ecto я определил эту сущность:

defmodule MyModule.User do
  use Ecto.Schema
  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  schema "users" do
    field :email, :string
  end

  @fields ~w(email)

  def changeset(data, params \\ %{}) do
    data
    |> cast(params, @fields)
    |> validate_required([:email])
    |> validate_length(:email, max: 128)
    |> unique_constraint(:email)
  end
end

Затем я могу сохранить запись в БД в iex-терминале, набрав:

iex> user1 = MyModule.User.changeset(%MyModule.User{}, %{email: "[email protected]"})
iex> MyModule.Repo.insert!(user1)

Все работает нормально, запись сохраняется. Но когда я пытаюсь получить его с помощью Repo.get():

iex> MyModule.Repo.get(MyModule.User, 0)

Я получаю эту ошибку:

** (Ecto.Query.CastError) deps/ecto/lib/ecto/repo/queryable.ex:320:
value `0` in `where` cannot be cast to type :binary_id in query:

from u in ScorecardBackend.User,
  where: u.id == ^0,
  select: u

  (elixir) lib/enum.ex:1755: Enum."-reduce/3-lists^foldl/2-0-"/3
  (elixir) lib/enum.ex:1325: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3

Мой вопрос: есть ли способ ввести литералы :binary_id в командной строке iex? Большое спасибо!


person Adam Libuša    schedule 19.01.2017    source источник


Ответы (1)


Поле binary_id представлено в Elixir как строка, поэтому вам нужно передать строку в Repo.get, содержащую binary_id, например:

MyModule.Repo.get(MyModule.User, "0e31998f-503f-4218-a801-c8bb7ff9498b")

Точная длина и формат поля binary_id зависит от базы данных. В PostgreSQL это UUID, а автоматически сгенерированный по умолчанию — случайный UUID. Вы можете увидеть, какой идентификатор был сгенерирован, выбрав все записи:

MyModule.Repo.all(MyModule.User)
person Dogbert    schedule 19.01.2017