0

我正在用 Postgres 作为数据存储在 Elixir 中编写应用程序。在 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然后,我可以通过键入以下内容在 -terminal的 db 中保存一条记录:

iex> user1 = MyModule.User.changeset(%MyModule.User{}, %{email: "foo@bar.com"})
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?非常感谢!

4

1 回答 1

3

字段在binary_idElixir 中表示为字符串,因此您需要将字符串传递给Repo.get包含 的binary_id,例如:

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

字段的确切长度和​​格式binary_id取决于数据库。在 PostgreSQL 中,它是一个 UUID,默认自动生成的是一个随机 UUID。您可以通过获取所有记录来查看生成的 ID:

MyModule.Repo.all(MyModule.User)
于 2017-01-19T10:29:37.977 回答