dersar00
Failed save to database
Hello!
Git Repository here.
I have a problem with saving data to database. I use mongodb_ecto adapter, when I try save it through iex console I can do it:
iex(1)> Friends.PersonController.save()
START SAVING
SAVED
09:58:17.706 [debug] QUERY OK db=0.4ms
INSERT coll="people" document=[age: 11, _id: #BSON.ObjectId<5b027c190d1a8f0f042d5600>] []
:ok
or
iex(1)> person = %Friends.Person{}
%Friends.Person{
__meta__: #Ecto.Schema.Metadata<:built, "people">,
age: nil,
first_name: nil,
id: nil,
last_name: nil
}
iex(2)> Friends.Repo.insert(person)
10:50:43.451 [debug] QUERY OK db=0.4ms
INSERT coll="people" document=[_id: #BSON.ObjectId<5b0288630d1a8f06ef2e3699>] []
{:ok,
%Friends.Person{
__meta__: #Ecto.Schema.Metadata<:loaded, "people">,
age: nil,
first_name: nil,
id: "5b0288630d1a8f06ef2e3699",
last_name: nil
}}
But if uncomment Friends.PersonController.save and try to call it when program is work, I got error:
⇒ mix
Compiling 1 file (.ex)
START SAVING
== Compilation error in file lib/friends.ex ==
** (ArgumentError) argument error
(stdlib) :ets.lookup_element(Mongo.IdServer, :machineprocid, 2)
lib/mongo/id_server.ex:50: Mongo.IdServer.new/0
lib/ecto/repo/schema.ex:651: Ecto.Repo.Schema.autogenerate_id/4
lib/ecto/repo/schema.ex:199: anonymous fn/13 in Ecto.Repo.Schema.do_insert/4
lib/friends/person_controller.ex:11: Friends.PersonController.save/0
lib/friends.ex:4: (module)
What’s the solution for it? How I can do it?
I have an assumption that when I run the program, I just do not start Mongo?
Most Liked Responses
Nicd
That works on its own but not in a project where you have other applications that need starting up. In addition, the example in the documentation deals with exs (script mode) files, which are run like scripts. Normally your ex files are compiled first and then executed.
You need to look at how Elixir projects are started using a supervision tree. Unfortunately I’m quite busy right now so I can’t link any tutorial but I hope others can help in this regard. Basically what you want is a supervision tree that starts the necessary applications (like your Ecto.Repo), then starts a process with that RabbitMQ listener code.
Nicd
The code at the end of the file (outside the defmodule) is again run at compile time. I suggest you read up on how Elixir programs are started as to where you should put your code. You cannot put code just anywhere, because at compile time your applications are not running.








