如何在Phoenix框架中使用RethinkDB?

18

刚刚开始学习 Elixir/Phoenix,想使用 RethinkDB 而不是 PostgreSQL,但文档和示例都只提供了与 PostgreSQL 相关的信息(似乎是默认/官方数据库)。Hamiltop 的 Rethinkdb-elixir 包非常好,但遗憾的是 Wiki 中的文档还没有准备好,Readme 中的内容对我来说不够。

我绝对不想使用 SQL(之前用过 Meteor/MongoDB,数据库不是问题)。

有人能给我展示一下以下功能所需代码的简单示例吗:

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

这可能听起来很傻,但 Meteor 已经为我们处理了这些问题,现在这对我来说成为了问题......因为我无法正确地完成这些操作。谢谢!


我认为目前没有适用于RethinkDB的适配器,因此您必须编写、手动编写填充Ecto模型的查询或完全停止使用Ecto。无论如何,我认为这种问题类型,在SO上要求基本上是有关该主题的教程,不太适合,所以我投票要关闭-请确实遇到研究过程中遇到的任何具体问题再回来! - Paweł Obrok
@Pawel Obrock,我理解你对这个问题的看法,但它涉及到了我在尝试让所有这些工作时遇到的几个问题(可能会引发特定的问题)。我没有使用Ecto,我能够解决一些问题,但有些问题我无法解决。我希望通过下面的评论提出更具体的问题... - Paulo Janeiro
我认为更好的方法是创建许多具有特定问题和代码示例的问题 - 这样将来遇到这些问题的人们将更能够找到和使用这些知识。 - Paweł Obrok
1
将来我会采纳那个建议。谢谢! - Paulo Janeiro
@PawełObrok 我理解你的观点,但我不同意。目前我也遇到了类似的问题,涉及Elixir/Phoenix和OrientDB,找到这个带有答案的问题对我帮助很大。 - Ole Spaarmann
1个回答

23

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

mix phoenix.new some_app --no-ecto

第二步) 在mix.exs中添加rethinkdb作为依赖项

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

第六步) 执行查询:

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运行它。

在 lib/some_app.rb 文件中添加到监管树和已经默认创建的 lib/name_of_the_app.ex 有什么区别?(步骤5) - Paulo Janeiro
@PauloJaneiro 我使用了 some_app,因为那是我的应用程序的名称。请将 some_app 替换为您的应用程序名称。我添加的代码是 worker(RethinkDB.Connection, [[name: SomeApp.Database, host: 'localhost', port: 28015]]) - Gazler
非常感谢rethinkdb-elixir的作者。我们能否在Github上的Wiki中记录下这个例子? - hamiltop
@hamiltop,我完全没有问题。我建议你遵循Stack Overflow在这个问题上的规定。我找到了这个链接:http://meta.stackexchange.com/questions/24611/is-it-legal-to-copy-stack-overflow-questions-and-answers - Gazler
为了更新这个,我已经开源了一个使用上述代码的示例应用,并进行了更新: https://github.com/AdamBrodzinski/phoenix-rethinkdb-example - SkinnyG33k
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接