2016-05-31 41 views
5
# mix.exs 
    defp deps do 
    [{:phoenix, "~> 1.1.4"}, 
     {:postgrex, ">= 0.0.0"}, 
     {:phoenix_ecto, "~> 3.0.0-rc"}, 
     {:gettext, "~> 0.9"}, 
     ... 
    ] 
    end 

Zainstalowana wersja ekto jest "2.0.0-rc.5"insert_all nie tworzy automatycznie generowane inserted_at z ekto 2,0

iex(1)> categories = [%{name: "stackoverflow", url: "stackoverflow.com"}] 

iex(2)> App.Repo.insert_all App.Category, categories 

** (Postgrex.Error) ERROR (not_null_violation): null value in column "inserted_at" violates not-null constraint 

    table: categories 
    column: inserted_at 

Failing row contains (1, stackoverflow, stackoverflow.com, null, null). 
    (ecto) lib/ecto/adapters/sql.ex:176: Ecto.Adapters.SQL.query!/5 
    (ecto) lib/ecto/adapters/sql.ex:350: Ecto.Adapters.SQL.insert_all/8 
    (ecto) lib/ecto/repo/schema.ex:42: Ecto.Repo.Schema.do_insert_all/6 
iex(2)> 

Od docs, wydawało się, że został wygenerowany automatycznie inserted_at. Czy muszę ręcznie wykonać tę część?

schema "categories" do 
field :name, :string 
field :url, :string 

timestamps 
end 

Odpowiedz

11

Funkcja Ecto.Schema.timestamps/1 definiuje inserted_at i updated_at kolumn. W migracjach jest funkcja o tej samej nazwie.

Można też ustawić to na poziomie bazy danych za pomocą:

alter table(:categories) do 
    modify :inserted_at, :datetime, default: fragment("NOW()") 
end 

Można go ustawić w swojej mapie:

categories = [%{name: "stackoverflow", url: "stackoverflow.com", inserted_at: Ecto.DateTime.utc}] 

Niezależnie rozwiązanie wybierzesz, będzie prawdopodobnie musiał zrobić to samo dla updated_at.

Jeśli nie chcesz śledzić znaczników czasu, możesz zdalnie usunąć timestamps ze swojego schematu i upuścić kolumny w migracji (lub jeśli nie zatwierdziłeś migracji do kontroli wersji, po prostu usuń tam także funkcję timestamps.

+0

Dziękuję. Wystąpił błąd dla 'updated_at' teraz. Naprawiono to za pomocą sugerowanego powyżej. –

+0

: typ datetime w migracji jest przestarzały, użyj: utc_datetime lub: naive_datetime zamiast – arcseldon

0

z insert_all documentation.

... znaczniki czasu, nie zostanie wygenerowany automatycznie podczas korzystania insert_all/3 Ten jest zgodne z projektem, jak ta funkcja ma być bardziej bezpośredni sposób, aby wstawić dane do bazy danych bez udogodnień: insert/2 ..