1

(代码在 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
4

1 回答 1

2

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

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

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

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

于 2014-12-05T16:09:38.987 回答