刚到Elixir / Phoenix时,我想使用RethinkDB而不是PostgreSQL,但是我只在PostgreSQL(这似乎是默认/官方数据库)上找到文档/示例。 Hamiltop有一个非常好的软件包(Rethinkdb-elixir),但是不幸的是Wiki中的文档还没有准备好,自述文件对我来说还不够。
我绝对不想使用SQL(我来自使用Meteor / MongoDB,而数据库不是问题)。
谁能给我看一个我需要的简单代码示例:


连接到RethinkDB;
启动服务器/管理服务器/连接;
创建一个数据库/表;
执行基本的CRUD操作。


这听起来可能很愚蠢,但由于Meteor为我们照顾了这些问题,现在这对我来说是个问题...因为我无法正确地做到这一点。谢谢!

最佳答案

步骤1)生成没有ecto的项目:

mix phoenix.new some_app --no-ecto


步骤2)将rethinkdb添加为mix.exs中的依赖项

defp deps do
  [{:phoenix, "~> 0.13.1"},
   {:phoenix_html, "~> 1.0"},
   {:phoenix_live_reload, "~> 0.4", only: :dev},
   {:rethinkdb, "~> 0.0.5"},
   {:cowboy, "~> 1.0"}]
end


步骤3)运行mix deps.get

步骤4)建立资料库:

defmodule SomeApp.Database do
  use RethinkDB.Connection
end


步骤5)将其添加到lib/some_app.ex中的监视树中-name应该与上面的数据库模块(SomeApp.Database)相匹配

def start(_type, _args) do
  import Supervisor.Spec, warn: false

  children = [
    # Start the endpoint when the application starts
    supervisor(SomeApp.Endpoint, []),
    worker(RethinkDB.Connection, [[name: SomeApp.Database, host: 'localhost', port: 28015]])
    # Here you could define other workers and supervisors as children
  ]

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


步骤6)执行查询:

defmodule Rethink.PageController do
  use Rethink.Web, :controller
  use RethinkDB.Query

  plug :action

  def index(conn, _params) do
    table_create("people")
    |> SomeApp.Database.run
    |> IO.inspect

    table("people")
    |> insert(%{first_name: "John", last_name: "Smith"})
    |> SomeApp.Database.run
    |> IO.inspect

    table("people")
    |> SomeApp.Database.run
    |> IO.inspect
    render conn, "index.html"
  end
end


请注意:为了方便运行,我将查询放在PageController中。在一个真实的示例中,它们将在单独的模块中-可能代表您的资源。

还要注意的另一件事是,我正在控制器上内联创建表。您可以执行命令以在文件中创建表,例如priv/migrations/create_people.exs并使用mix run priv/migrations/create_people.exs运行它

关于elixir - 如何在Phoenixframework中使用RethinkDB?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31457945/

10-15 22:42