Elixir ecto подключиться к существующей БД

Проведя небольшое исследование по ссылке ниже

https://github.com/elixir-lang/ecto/tree/master/examples/simple

Я немного не понимаю, как использовать экто в эликсире.

Всегда схема, объявленная как

defmodule Weather do
  use Ecto.Model

  schema "weather" do
    field :city, :string
    field :temp_lo, :integer
    field :temp_hi, :integer
    field :prcp, :float, default: 0.0
    timestamps
  end
end

а затем в части "Запрос"

 def sample_query do
   query = from w in Weather,
      where: w.prcp > 0.0 or is_nil(w.prcp),
      select: w
   Simple.Repo.all(query)
   end
 end

ecto gona формирует запрос, используя схему, объявленную в Weather

Мой вопрос в том, что я просто хочу подключиться к существующей базе данных TESTDB и выполнить SELECT, мне не нужна новая схема для выполнения моей работы. Можно ли сделать это в экто, пожалуйста?

Когда я создаю свой собственный запрос вроде

query = from w in tenant

после ввода команды $ mix do deps.get, compile

ошибка сообщает мне function tenant/0 undefined

tenant не функция, это просто таблица в TESTDB, которую я нигде не объявлял

Я думаю, что просто потерял себя в экто


person 王志軍    schedule 11.05.2015    source источник


Ответы (2)


Вам необходимо объявить схему для своей таблицы, независимо от того, создаете ли вы ее с помощью Ecto или нет. Я не думаю, что сейчас есть возможность делать это автоматически. Так, например, у вас может быть что-то вроде:

defmodule Tenant do
  use Ecto.Model

  schema "tenant" do
    field :id, :integer
    field :name, :string
    # and so on depending on the columns in your table
  end
end

А затем сделайте query = from w in Tenant, select: w

person Paweł Obrok    schedule 11.05.2015
comment
Я только что понял, когда я делаю select запрос, извлекаются поля, объявленные в схеме. - person 王志軍; 13.05.2015

Вы можете запросить любую таблицу в базе данных, передав строку:

from p in "posts", where: p.id > 0

В таких случаях вам не нужно определять какую-либо схему, вы можете просто запросить таблицу напрямую. Наконец, вы также можете напрямую выполнить SQL-запрос:

Ecto.Adapters.SQL.query(YourRepo, "SELECT $1", [1])

Но тогда вы теряете большую часть преимуществ, которые дает вам Ecto.

person José Valim    schedule 11.05.2015
comment
Это информативно !! Я также понял, хочу ли я выбрать несколько полей, мне нужно сделать это как select: {p.id, p.uuid} - person 王志軍; 14.05.2015
comment
Вроде не получается. Я получаю следующее сообщение об ошибке: Please specify a model or specify exactly which fields from "l0" you desire in query:. - person Martinos; 13.04.2016
comment
Я попытался добавить select: p.*, но ничего не вышло. Можно ли перечислить все поля, не перечисляя их? - person Martinos; 13.04.2016