Подтвердить что ты не робот

Как использовать RethinkDB с Phoenixframework?

Только что прибыв в Elixir/Phoenix, я хочу использовать RethinkDB вместо PostgreSQL, но я только нахожу документацию/примеры на PostgreSQL (которая, по-видимому, является официальной базой данных по умолчанию). Существует очень хороший пакет от Hamiltop (Rethinkdb-elixir), но, к сожалению, документация в Wiki не готова, и в Readme мне недостаточно. Я абсолютно не хочу использовать SQL (я пришел из использования Meteor/MongoDB, где база данных не была проблемой). Может ли кто-нибудь показать мне простой пример кода, который мне нужен:

  • Подключиться к RethinkDB;
  • Запустить сервер/управлять сервером/соединениями;
  • Создать базу данных/таблицу;
  • Выполнять основные операции CRUD.

Это может показаться глупым, но поскольку Метеор позаботился об этом для нас, теперь это проблема для меня... потому что я не в состоянии сделать это правильно. Спасибо!

4b9b3361

Ответ 1

Шаг 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 только для удобства работы. В реальном примере они будут в отдельном модуле - возможно, в том, что представляет ваш ресурс.

Другое дело, что я создаю таблицу inline на контроллере. Вы можете выполнить команду для создания таблицы в файле, например priv/migrations/create_people.exs, и запустить ее с помощью mix run priv/migrations/create_people.exs