18

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

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

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

4

1 回答 1

23

步骤 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

于 2015-07-16T15:33:26.123 回答