在循环中生成记录,它们是乱序的。这是 Elixir 还是 Postgres 的东西?
Generating records in a loop, they are out of order. Is this an Elixir or Postgres thing?
我正在为测试生成一些数据。
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)
如果我将睡眠时间提高到 1000 毫秒,它就可以工作,但它应该在没有任何睡眠的情况下工作,对吧?这是 Postgres 还是 Elixir 的东西。还是我没有理解循环在 Elixir 中是如何工作的?这些是按顺序生成和保存的吧?
编辑:看起来 ecto 向数据库中插入了一个 erl 时间
INSERT INTO "posts" ("inserted_at", "updated_at", ...)
VALUES (, , ...)
RETURNING "id" [{{2016, 8, 15}, {7, 21, 50, 0}}, {{2016, 8, 15}, {7, 21, 50, 0}}, ...] query=1.2ms
因此,在这种情况下,您只能精确到秒。除了按 inserted_at 和 id 排序(这看起来很草率)
之外,有什么办法可以解决这个问题
彼得,你这个帅气的恶魔。您可以通过将 :usec bool 切换为 true
来解决此问题
defmodule Post do
schema "posts" do
timestamps(usec: true)
end
end
我正在为测试生成一些数据。
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)
如果我将睡眠时间提高到 1000 毫秒,它就可以工作,但它应该在没有任何睡眠的情况下工作,对吧?这是 Postgres 还是 Elixir 的东西。还是我没有理解循环在 Elixir 中是如何工作的?这些是按顺序生成和保存的吧?
编辑:看起来 ecto 向数据库中插入了一个 erl 时间
INSERT INTO "posts" ("inserted_at", "updated_at", ...)
VALUES (, , ...)
RETURNING "id" [{{2016, 8, 15}, {7, 21, 50, 0}}, {{2016, 8, 15}, {7, 21, 50, 0}}, ...] query=1.2ms
因此,在这种情况下,您只能精确到秒。除了按 inserted_at 和 id 排序(这看起来很草率)
之外,有什么办法可以解决这个问题彼得,你这个帅气的恶魔。您可以通过将 :usec bool 切换为 true
来解决此问题
defmodule Post do
schema "posts" do
timestamps(usec: true)
end
end