Elixir 原始SQL与exto

Elixir 原始SQL与exto,elixir,phoenix-framework,Elixir,Phoenix Framework,我对长生不老药和凤凰框架的世界很陌生。我正试图学习FirehoseProject教程,但在使用Exto查询原始SQL时遇到了问题。教程说这应该可以: defmodule Queries do def random do query = Ecto.Adapters.Postgres.query( Repo, "SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1", []) %Postgrex

我对长生不老药和凤凰框架的世界很陌生。我正试图学习FirehoseProject教程,但在使用Exto查询原始SQL时遇到了问题。教程说这应该可以:

defmodule Queries do
def random do
  query = Ecto.Adapters.Postgres.query(
    Repo,
    "SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1",
    [])
  %Postgrex.Result{rows: [row]} = query
  {id, saying, author} = row
  %Splurty.Quote{id: id, saying: saying, author: author}
end
end
我得到一个运行时错误,即exto.Adapters.Postgres.query不存在(未定义的函数)

我试图搜索EXTO文档,发现可能有一个名为run_query的函数,但它也不起作用

我想我使用的是Ecto 1.1.4,但我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)示例

firehoseproject的链接是:

然后您可以将结果添加到列表中,例如:

list = []

case result do
  {:ok, columns} ->
            list = for item <- columns.rows do
                List.first(item)
            end
  _ -> IO.puts("error")
end
list=[]
案例结果如何
{:好的,列}->
列表=对于项目IO.puts(“错误”)
结束

如果只需将原始SQL添加到正常的Ecto查询中,则可以使用:

这样做的次数足够多,而且更容易处理。您通常可以在EXTO查询的任何部分中使用fragment/1。为了更好地使用,您可以定义一个宏,使您能够很好地适应EXTO的DLS:

defmodule QueryHelpers do
  defmacro random() do
    quote do
      fragment("RANDOM()")
    end
  end
end
然后使用它:

import QueryHelpers
from q in Quote, order_by: random(), limit: 1

查询现在似乎可以工作了,但是我在将结果映射到我的对象模型(Quote)时遇到了问题。一般来说,我认为只有我在学习长生不老药。基本上,这可以解决我目前的问题,但为了学习,我想看看如何使用EXTO执行完整的原始sql。无论如何,这也是很高兴知道,并可能会在未来派上用场,谢谢!
defmodule QueryHelpers do
  defmacro random() do
    quote do
      fragment("RANDOM()")
    end
  end
end
import QueryHelpers
from q in Quote, order_by: random(), limit: 1