我正在用Elixir编写一个应用程序,使用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
-terminal的数据库中保存一条记录:
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
我的问题是:有没有办法在iex
-command行中输入:binary_id
文字?非常感谢!
发布于 2017-01-19 10:29:38
在Elixir中,binary_id
字段表示为字符串,因此您需要向Repo.get
传递一个包含binary_id
的字符串,例如:
MyModule.Repo.get(MyModule.User, "0e31998f-503f-4218-a801-c8bb7ff9498b")
binary_id
字段的确切长度和格式取决于数据库。在PostgreSQL中,它是一个UUID,自动生成的默认UUID是一个随机的UUID。您可以通过获取所有记录来查看生成的ID:
MyModule.Repo.all(MyModule.User)
https://stackoverflow.com/questions/41739250
复制相似问题