I realize there are multiple topics with the same title, but the questions and answers in those threads either don’t make sense to me or are not addressing my elephant.
I have followed the instructions on Elixir School: Ecto Basics and I am stuck.
I created a new mix mix new cc
. It did not generate an application.ex.
I then set up a repository by running:
$ mix ecto.gen.repo -r Cc.MySQL
* creating lib/cc
* creating lib/cc/my_sql.ex
* creating config/config.exs
Don't forget to add your new repo to your supervision tree
(typically in lib/cc/application.ex):
- I edited
config.exs
to addconfig :cc, ecto_repos: [Cc.MySQL]
, correct the MySQL creds and addprotocol: :tcp
:
import Config
config :cc, Cc.MySQL,
database: "ecto",
username: "ecto",
password: "ecto",
hostname: "localhost",
protocol: :tcp
config :cc, ecto_repos: [Cc.MySQL]
- I edited
my_sql.ex
to use MyXQL instead of the generated Postgres.
defmodule Cc.MySQL do
use Ecto.Repo,
otp_app: :cc,
adapter: Ecto.Adapters.MyXQL
end
According to the Ecto documentation, I need an application.ex. So I created one in lib/cc/application.ex
:
defmodule Cc.Application do
use Application
def start(_type, _args) do
children = [
Cc.MySQL,
]
opts = [strategy: :one_for_one, name: Cc.Supervisor]
Supervisor.start_link(children, opts)
end
end
after compiling the project and running, I use an existing Schema to try insert data:
$ iex -S mix
Compiling 1 file (.ex)
Interactive Elixir (1.16.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> cars = %CC.Cars.Model{agent: "localhost"}
%CC.Cars.Model{
__meta__: #Ecto.Schema.Metadata<:built, "cars">,
id: nil,
date: nil,
car: nil,
agent: "localhost",
}
iex(2)> Cc.MySQL.insert!(cars)
** (RuntimeError) could not lookup Ecto repo Cc.MySQL because it was not started or it does not exist
However if I run {:ok, pid} = Cc.MySQL.start_link()
in iex directly, I will get a PID. If I then run the command Cc.MySQL.insert!(cars)
I will start getting MySQL errors instead.
What am I missing that with allow my app to generate a PID for Cc.MySQL?