2016-08-15 6 views
1

테스트를 위해 데이터를 생성 중입니다.루프에서 레코드를 생성 할 때 순서가 잘못되었습니다. 이것은 Elixir 또는 Postgres의 것입니까?

posts = for i <- 0..10 do 
    :timer.sleep 100 
    {:ok, post} = Post.changeset(%Post{},%{title: "Some Post #{i}"}) |> Repo.insert 
    post.title 
end |> Enum.reverse 
all_posts = Repo.all(from p in Post, order_by: [desc: :inserted_at]) |> Enum.map(&(&1.title)) 
assert all_posts == posts 

그러나 이것은 실패합니다.

Assertion with == failed 
    code: all_posts == posts 
    lhs: ["Some Post 10", "Some Post 1", "Some Post 2", "Some Post 3", "Some Post 4", "Some Post 0", "Some Post 6", "Some Post 7", "Some Post 8", "Some Post 9", "Some Post 5"] 
    rhs: ["Some Post 10", "Some Post 9", "Some Post 8", "Some Post 7", "Some Post 6", "Some Post 5", "Some Post 4", "Some Post 3", "Some Post 2", "Some Post 1", "Some Post 0"] 
    stacktrace: 
     test/models/post_test.exs:35: (test) 

나는 잠이 작동 한 후 1000MS하는 것이 아니라 정말 잘, 잠없이 작동 범프 경우? 이것은 Postgres 나 Elixir일까요? 아니면 엘릭서에서 루프가 어떻게 작동 하는지를 파악하지 못했습니까? 이것들은 순차적으로 생성되어 저장됩니다.

편집 : 체외 그래서 당신은 오직이 경우에는 두 번째로 정밀도를 얻을거야 DB

INSERT INTO "posts" ("inserted_at", "updated_at", ...) 
VALUES ($1, $2, ...) 
RETURNING "id" [{{2016, 8, 15}, {7, 21, 50, 0}}, {{2016, 8, 15}, {7, 21, 50, 0}}, ...] query=1.2ms 

내로 ERL 시간을 삽입하는 것 같습니다. inserted_at 및 id (위저로 보이는 것)에서 정렬하는 것 외에는이 방법이 있습니까?

+0

에 (마이크로 초) 부울을 얼마나 하나 개 삽입 데이터베이스에 걸립니까? 이 'posts' 테이블에는 무거운 트리거 나 수표 등이 있습니까? – JustMichael

+0

@JustMichael 4 개의 인덱스가 있지만 모든 레코드는 동일하므로 동일한 영향을받습니다. 나는이 문제가 Ecto에 있다고 생각한다. Ecto.DateTime이 erl 시간 소인을 삽입하면 두 번째 시간에만 정확합니다. 이것은 나에게 버그처럼 보인다. –

+0

외계인 타임 스탬프에 밀리 초가 있는지 확인 했으므로 외계인 타임 스탬프에 맞지 않을 수 있습니다. – JustMichael

답변

1

피터, 잘 생긴 악마. 당신은을 전환하여이 문제를 해결할 수 있습니다 : 사실

defmodule Post do schema "posts" do timestamps(usec: true) end end