【问题标题】:Elixir Ecto/Postgrex outputting weird debug Message on Repository.insertElixir Ecto/Postgrex 在 Repository.insert 上输出奇怪的调试消息
【发布时间】:2015-01-24 20:21:27
【问题描述】:

(代码在 Github https://github.com/fabianhjr/AseguradoraElixir/tree/fcfeacbee1ec9bc9f59bb01e65743983ae0986d3

尝试将 Ecto/Postgrex 与某些模型一起使用时,我在存储库插入时得到了意外的输出。(lib/main.ex:63)

   62     %Cliente{nombre: nombre, direccion: direccion, telefono: telefono, email: email}
   63     |> Db.insert   

得到以下错误

07:08:32.063 [error] Error in process <0.148.0> with exit value: {#{'__exception__'=>true,'__struct__'=>'Elixir.Postgrex.Error',message=>nil,postgres=>#{code=><<5 bytes>>,file=><<10 bytes>>,line=><<3 bytes>>,message=><<44 bytes>>,routine=><<12 bytes>>,severity=><<5 bytes>>}},[{'Elixir.Ecto.Adapters.Postgres.Worker','query!',4,[{file,"lib/ecto/adapters/postg... 

我使用 pgAdmin 连接到数据库,手动完成了架构,因为 mix ecto.gen.migration / mix ecto.migrate 似乎被破坏了。 (我从 elixir 开始,所以我可能做错了什么,有人指出我在 mix.exs 中检查我的入口点,我认为它们很好)我尝试使用 IO.inspect,但它仍然很丑陋且不可读。(存储库.get [Model] [id] 不会崩溃,只是返回 nil)

任何正确方向的指针将不胜感激。


更新 感谢 Jose 提供更好的错误消息

09:13:04.292 [error] Task #PID<0.151.0> started from #PID<0.135.0> terminating
Function: #Function<20.90072148/0 in :erl_eval.expr/5>
    Args: []
** (exit) an exception was raised:
    ** (Postgrex.Error) FATAL (3D000): database "aseguradora simple" does not exist
        lib/ecto/adapters/postgres/worker.ex:18: Ecto.Adapters.Postgres.Worker.query!/4
        lib/ecto/adapters/postgres.ex:357: Ecto.Adapters.Postgres.use_worker/3
        lib/ecto/adapters/postgres.ex:90: Ecto.Adapters.Postgres.insert/3
        lib/ecto/repo/backend.ex:91: Ecto.Repo.Backend.insert/4
        (elixir) lib/task/supervised.ex:74: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:19: Task.Supervised.async/3
        (stdlib) proc_lib.erl:237: :proc_lib.init_p_do_apply/3

【问题讨论】:

  • 这是一个非常可怕的错误。当您在 Task.async(fn -&gt; ... existing code ... end) |&gt; Task.await 中执行相同的操作时会发生什么。你至少得到一个更好的错误吗?
  • 谢谢,会尽快检查。
  • 没有所有的迁移,我的傻。非常感谢,它确实帮助我调试了这个。
  • 我很高兴你修好了它!尽管您最初收到如此糟糕的错误消息,但我感到很惊讶。您是否直接产生了新进程?如果是这样,请考虑使用 Task.start/Task.start_link 来创建新进程,因为它总是意味着更好的错误消息。 :)
  • @FabiánHerediaMontiel 请回答您自己的问题并将该答案标记为已接受。这让未来的访问者可以快速找到修复并清楚地表明问题已解决。谢谢。

标签: elixir ecto


【解决方案1】:

似乎某处某处直接使用 spawn_link 或类似方法生成了一个进程,这就是为什么您没有得到一个好的错误报告的原因。推荐使用 Task.start_link/1 有两个原因:

  1. 它适用于监督树
  2. 当出现问题时,您会收到漂亮的日志消息

因此,如果您需要返回值,我建议您使用 Task.start_link/1 或 Task.async/1 + Task.await/1。这应该会给你一个更好的堆栈跟踪,从而帮助你了解真正发生的事情。

PS:Erlang 18 有可能包含一种为“裸进程”自定义错误报告的方法,那么使用 Task 的主要原因基本上是将它们嵌入到监督树中。

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多