如何使用与ecto不同的db驱动程序使用Phoenix?例如OrientDB

时间:2015-11-05 16:37:02

标签: elixir phoenix-framework

我试图围绕如何使用不同的DB驱动程序和没有Ecto来使用Phoenix,因为我想连接到OrientDB。有一个名为MarcoPolo的二进制驱动程序,奇怪的是我能够使用poolboy创建一个工作池来连接它 - 但不仅仅是一个简单的连接。我对Elixir来说还是一个新手。

这就是我所做的:

在mix.exs中定义依赖关系

  defp deps do
    [{:phoenix, "~> 1.0.3"},
     {:phoenix_html, "~> 2.1"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:cowboy, "~> 1.0"},
     {:poolboy, "~> 1.5"},
     {:marco_polo, "~> 0.2"}
   ]
  end

在lib / myapp / orientdb_repo.ex

中为我的仓库创建一个模块
defmodule MyApp.OrientRepo do
  use MarcoPolo
end

在lib / myapp.ex

中定义worker
  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      # Start the endpoint when the application starts
      supervisor(MyApp.Endpoint, []),
      # Here you could define other workers and supervisors as children
      # worker(MyApp.Worker, [arg1, arg2, arg3]),
      worker(MyApp.OrientRepo, [user: "admin", password: "admin", connection: {:db, "database", :graph}])
    ]

    # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end

但是当我尝试启动服务器时,它告诉我MarcoPolo未定义:

== Compilation error on file lib/myapp/orientdb_repo.ex ==
** (UndefinedFunctionError) undefined function: MarcoPolo.__using__/1
    MarcoPolo.__using__([])
    (stdlib) erl_eval.erl:669: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:100: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/8

我认为这应该是可用的,因为我加入了MarcoPolo。可能它非常简单,但我只是不明白......

1 个答案:

答案 0 :(得分:1)

看起来MarcoPolo没有__using__宏扩展为start_link,stop_link和其他GenServer方法。

Ecto如何在回购 - https://github.com/elixir-lang/ecto/blob/3d39d89523eb4852725799db7eb7869715bd8c0d/lib/ecto/repo.ex#L60

中做到这一点

如果您想使用MarcoPolo,您需要自己提供

lib/MyRepo/orient_repo.ex                                                                                                                                         
defmodule MyRepo.OrientRepo do
  require MarcoPolo

  def start_link(opts\\[]) do
    MarcoPolo.start_link opts
  end

  #  ..and many more, take a look at GenServer
end

当你启动worker时,将所有参数作为一个数组传递

worker(MyRepo.OrientRepo, [[user: "admin", password: "admin", connection: {:db, "database", :graph}]])

在我的情况下,它会导致错误:

[error] OrientDB TCP connect error (localhost:2424): connection refused

因为我的计算机上没有OrientDB。另一种选择是直接启动MarcoPolo,因为@whatyouhide在评论中说。

有关use的更多详情,请访问:http://elixir-lang.org/getting-started/alias-require-and-import.html#use