2017-01-19 9 views
0

Ich schreibe eine Anwendung in Elixir mit Postgres als Datenspeicher. In Ecto, definiert ich diese Einheit:Wie man eingibt: binary_id in iex Befehlszeile?

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 

Dann kann ich einen Datensatz in der db in iex -terminale, indem Sie sparen:

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

Alles läuft ok und der Datensatz wird gespeichert. Aber wenn ich versuche, es zurückzuholen mit Repo.get():

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

ich diesen Fehler:

** (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 

Meine Frage: Gibt es eine Möglichkeit :binary_id Literale in der iex -command Linie zu geben? Danke vielmals!

Antwort

3

A binary_id Feld als String in Elixir dargestellt wird, so müssen Sie einen String an Repo.get enthalten die die binary_id, zum Beispiel passieren:

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

Die genaue Länge und das Format eines binary_id Feld abhängt, die Datenbank. In PostgreSQL ist dies eine UUID und die automatisch generierte Standard-UUID ist eine zufällige UUID. Sie können sehen, welche ID generiert wurde, indem Sie alle Datensätze abrufen:

MyModule.Repo.all(MyModule.User) 
Verwandte Themen